查看: 891|回復: 11

[閒聊閒語] 12/24摇一摇

[複製鏈接]

132

主題

1497

帖子

1萬

金錢

巴列斯

Rank: 10Rank: 10Rank: 10

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
60
積分
15042
在線時間
104 小時
相冊
1
日誌
0
好友
1
發表於 2025-12-24 08:51 | 顯示全部樓層 |閱讀模式

132

主題

1497

帖子

1萬

金錢

巴列斯

Rank: 10Rank: 10Rank: 10

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
60
積分
15042
在線時間
104 小時
相冊
1
日誌
0
好友
1
 樓主| 發表於 2025-12-24 08:53 | 顯示全部樓層
#在這裡快         摇一摇一摇速回復#

[發帖際遇]: 爱吃鱼的大柚 發帖時在路邊撿到 4 金錢,偷偷放進了口袋. 幸運榜 / 衰神榜
回復 支持 反對

使用道具 舉報

132

主題

1497

帖子

1萬

金錢

巴列斯

Rank: 10Rank: 10Rank: 10

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
60
積分
15042
在線時間
104 小時
相冊
1
日誌
0
好友
1
 樓主| 發表於 2025-12-24 09:03 | 顯示全部樓層
       
摇一摇一摇

回復 支持 反對

使用道具 舉報

132

主題

1497

帖子

1萬

金錢

巴列斯

Rank: 10Rank: 10Rank: 10

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
60
積分
15042
在線時間
104 小時
相冊
1
日誌
0
好友
1
 樓主| 發表於 2025-12-24 09:09 | 顯示全部樓層
摇一摇一摇

回復 支持 反對

使用道具 舉報

132

主題

1497

帖子

1萬

金錢

巴列斯

Rank: 10Rank: 10Rank: 10

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
60
積分
15042
在線時間
104 小時
相冊
1
日誌
0
好友
1
 樓主| 發表於 2025-12-24 09:51 | 顯示全部樓層
摇一摇一摇

回復 支持 反對

使用道具 舉報

132

主題

1497

帖子

1萬

金錢

巴列斯

Rank: 10Rank: 10Rank: 10

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
60
積分
15042
在線時間
104 小時
相冊
1
日誌
0
好友
1
 樓主| 發表於 2025-12-24 10:04 | 顯示全部樓層
摇一摇一摇

回復 支持 反對

使用道具 舉報

132

主題

1497

帖子

1萬

金錢

巴列斯

Rank: 10Rank: 10Rank: 10

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
60
積分
15042
在線時間
104 小時
相冊
1
日誌
0
好友
1
 樓主| 發表於 2025-12-24 17:07 | 顯示全部樓層
摇一摇一摇

回復 支持 反對

使用道具 舉報

132

主題

1497

帖子

1萬

金錢

巴列斯

Rank: 10Rank: 10Rank: 10

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
60
積分
15042
在線時間
104 小時
相冊
1
日誌
0
好友
1
 樓主| 發表於 2025-12-24 17:13 | 顯示全部樓層
摇一摇一摇

回復 支持 反對

使用道具 舉報

132

主題

1497

帖子

1萬

金錢

巴列斯

Rank: 10Rank: 10Rank: 10

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
60
積分
15042
在線時間
104 小時
相冊
1
日誌
0
好友
1
 樓主| 發表於 2025-12-24 17:22 | 顯示全部樓層
摇一摇一摇

回復 支持 反對

使用道具 舉報

132

主題

1497

帖子

1萬

金錢

巴列斯

Rank: 10Rank: 10Rank: 10

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
60
積分
15042
在線時間
104 小時
相冊
1
日誌
0
好友
1
 樓主| 發表於 2025-12-24 17:27 | 顯示全部樓層
关键技术要点说明:

怪物分类显示系统:

主动攻击怪物显示为红点

被动怪物显示为黄点

BOSS级怪物显示为大红点并标注"BOSS"

实时位置同步机制:

服务器发送S_NPCPack封包通知怪物出现

服务器发送S_MoveNpcPacket封包更新怪物位置

客户端接收并立即更新小地图显示

小地图坐标转换:

将游戏世界坐标转换为小地图像素坐标

只显示玩家视野范围内的怪物

玩家固定在小地图中心,怪物位置相对显示

性能优化考虑:

使用CopyOnWriteArrayList保证线程安全

只更新视野内的怪物,减少绘制开销

根据怪物类型决定绘制细节(名称显示等)

扩展性设计:

可轻松添加更多怪物类型和图标

支持动态添加/移除怪物

可扩展为显示NPC、队友等其他实体

这个系统完整模拟了怪物在小地图上的红点显示和实时移动功能,可以直接运行观察效果。
  1. import java.util.*;
  2. import java.util.concurrent.*;
  3. import java.awt.*;
  4. import java.awt.image.BufferedImage;
  5. import javax.swing.*;
  6. import java.util.List;

  7. /**
  8. * 怪物小地图红点显示系统模拟
  9. * 演示如何在小地图上显示所有怪物为红点并实时跟随移动
  10. */

  11. // 1. 怪物数据包类 - 发送怪物出现信息给客户端
  12. class S_NPCPack {
  13.     private final int monsterId;
  14.     private final int x, y;
  15.     private final int gfxId;
  16.     private final int level;
  17.     private final boolean isAggressive;
  18.     private final int minimapType; // 0=不显示, 1=红点, 2=黄点, 3=BOSS
  19.    
  20.     public S_NPCPack(Monster monster) {
  21.         this.monsterId = monster.getId();
  22.         this.x = monster.getX();
  23.         this.y = monster.getY();
  24.         this.gfxId = monster.getGfxId();
  25.         this.level = monster.getLevel();
  26.         this.isAggressive = monster.isAggressive();
  27.         this.minimapType = calculateMinimapType(monster);
  28.     }
  29.    
  30.     private int calculateMinimapType(Monster monster) {
  31.         if (monster.isBoss()) {
  32.             return 3; // BOSS特殊图标
  33.         } else if (monster.isAggressive() || monster.getLevel() > 10) {
  34.             return 1; // 主动怪或高级怪显示红点
  35.         } else {
  36.             return 0; // 被动低级怪不显示
  37.         }
  38.     }
  39.    
  40.     // 获取封包数据(模拟)
  41.     public byte[] getPacketData() {
  42.         // 实际游戏中会使用二进制协议
  43.         // 这里简化返回关键信息
  44.         System.out.println("发送怪物出现封包: ID=" + monsterId +
  45.                          ", 位置=(" + x + "," + y + ")" +
  46.                          ", 小地图类型=" + minimapType);
  47.         return new byte[0];
  48.     }
  49.    
  50.     public int getMonsterId() { return monsterId; }
  51.     public int getX() { return x; }
  52.     public int getY() { return y; }
  53.     public int getMinimapType() { return minimapType; }
  54. }

  55. // 2. 怪物移动封包类 - 发送怪物移动信息给客户端
  56. class S_MoveNpcPacket {
  57.     private final int monsterId;
  58.     private final int newX, newY;
  59.     private final int heading;
  60.    
  61.     public S_MoveNpcPacket(Monster monster, int newX, int newY, int heading) {
  62.         this.monsterId = monster.getId();
  63.         this.newX = newX;
  64.         this.newY = newY;
  65.         this.heading = heading;
  66.     }
  67.    
  68.     public byte[] getPacketData() {
  69.         System.out.println("发送怪物移动封包: ID=" + monsterId +
  70.                          ", 新位置=(" + newX + "," + newY + ")" +
  71.                          ", 方向=" + heading);
  72.         return new byte[0];
  73.     }
  74.    
  75.     public int getMonsterId() { return monsterId; }
  76.     public int getNewX() { return newX; }
  77.     public int getNewY() { return newY; }
  78. }

  79. // 3. 怪物对象类
  80. class Monster {
  81.     private static int nextId = 1;
  82.    
  83.     private final int id;
  84.     private int x, y;
  85.     private int gfxId;
  86.     private int level;
  87.     private boolean aggressive;
  88.     private boolean boss;
  89.     private String name;
  90.    
  91.     public Monster(int x, int y, String name, int level, boolean aggressive, boolean boss) {
  92.         this.id = nextId++;
  93.         this.x = x;
  94.         this.y = y;
  95.         this.name = name;
  96.         this.level = level;
  97.         this.aggressive = aggressive;
  98.         this.boss = boss;
  99.         this.gfxId = level * 10; // 模拟图形ID
  100.     }
  101.    
  102.     public void move(int newX, int newY) {
  103.         this.x = newX;
  104.         this.y = newY;
  105.     }
  106.    
  107.     public void randomMove(int mapWidth, int mapHeight) {
  108.         int dx = (int)(Math.random() * 21) - 10; // -10 到 10
  109.         int dy = (int)(Math.random() * 21) - 10;
  110.         
  111.         int newX = Math.max(0, Math.min(mapWidth - 1, x + dx));
  112.         int newY = Math.max(0, Math.min(mapHeight - 1, y + dy));
  113.         
  114.         move(newX, newY);
  115.     }
  116.    
  117.     // Getters
  118.     public int getId() { return id; }
  119.     public int getX() { return x; }
  120.     public int getY() { return y; }
  121.     public int getGfxId() { return gfxId; }
  122.     public int getLevel() { return level; }
  123.     public boolean isAggressive() { return aggressive; }
  124.     public boolean isBoss() { return boss; }
  125.     public String getName() { return name; }
  126. }

  127. // 4. 游戏服务器类 - 管理怪物和发送封包
  128. class GameServer {
  129.     private final List<Monster> monsters = new ArrayList<>();
  130.     private final List<Client> clients = new ArrayList<>();
  131.     private final int mapWidth = 5000;
  132.     private final int mapHeight = 5000;
  133.    
  134.     // 添加怪物
  135.     public void addMonster(Monster monster) {
  136.         monsters.add(monster);
  137.         // 通知所有客户端怪物出现
  138.         broadcastToAllClients(new S_NPCPack(monster));
  139.     }
  140.    
  141.     // 添加客户端
  142.     public void addClient(Client client) {
  143.         clients.add(client);
  144.         // 发送所有已有怪物信息给新客户端
  145.         for (Monster monster : monsters) {
  146.             client.receivePacket(new S_NPCPack(monster));
  147.         }
  148.     }
  149.    
  150.     // 广播给所有客户端
  151.     private void broadcastToAllClients(Object packet) {
  152.         for (Client client : clients) {
  153.             client.receivePacket(packet);
  154.         }
  155.     }
  156.    
  157.     // 更新所有怪物位置(模拟怪物移动)
  158.     public void updateMonsterPositions() {
  159.         for (Monster monster : monsters) {
  160.             int oldX = monster.getX();
  161.             int oldY = monster.getY();
  162.             
  163.             // 随机移动怪物
  164.             monster.randomMove(mapWidth, mapHeight);
  165.             
  166.             // 如果位置改变,通知客户端
  167.             if (monster.getX() != oldX || monster.getY() != oldY) {
  168.                 int heading = calculateHeading(oldX, oldY, monster.getX(), monster.getY());
  169.                 broadcastToAllClients(new S_MoveNpcPacket(monster,
  170.                     monster.getX(), monster.getY(), heading));
  171.             }
  172.         }
  173.     }
  174.    
  175.     // 计算移动方向
  176.     private int calculateHeading(int fromX, int fromY, int toX, int toY) {
  177.         double angle = Math.atan2(toY - fromY, toX - fromX);
  178.         double degree = Math.toDegrees(angle);
  179.         if (degree < 0) degree += 360;
  180.         
  181.         // 转换为8方向
  182.         if (degree >= 337.5 || degree < 22.5) return 0;   // 东
  183.         if (degree >= 22.5 && degree < 67.5) return 1;    // 东北
  184.         if (degree >= 67.5 && degree < 112.5) return 2;   // 北
  185.         if (degree >= 112.5 && degree < 157.5) return 3;  // 西北
  186.         if (degree >= 157.5 && degree < 202.5) return 4;  // 西
  187.         if (degree >= 202.5 && degree < 247.5) return 5;  // 西南
  188.         if (degree >= 247.5 && degree < 292.5) return 6;  // 南
  189.         return 7; // 东南
  190.     }
  191.    
  192.     public List<Monster> getMonsters() { return monsters; }
  193.     public int getMapWidth() { return mapWidth; }
  194.     public int getMapHeight() { return mapHeight; }
  195. }

  196. // 5. 小地图显示类(客户端)
  197. class MiniMapPanel extends JPanel {
  198.     private final List<MonsterInfo> monsterInfos = new CopyOnWriteArrayList<>();
  199.     private final int playerX = 2500; // 玩家固定在小地图中心
  200.     private final int playerY = 2500;
  201.     private final int minimapSize = 400; // 小地图显示大小
  202.     private final int viewRange = 1000; // 小地图显示范围
  203.    
  204.     // 怪物信息类(客户端存储)
  205.     static class MonsterInfo {
  206.         int id;
  207.         int x, y;
  208.         int type; // 1=红点, 2=黄点, 3=BOSS
  209.         String name;
  210.         
  211.         MonsterInfo(int id, int x, int y, int type, String name) {
  212.             this.id = id;
  213.             this.x = x;
  214.             this.y = y;
  215.             this.type = type;
  216.             this.name = name;
  217.         }
  218.     }
  219.    
  220.     public MiniMapPanel() {
  221.         setPreferredSize(new Dimension(minimapSize + 50, minimapSize + 50));
  222.         setBackground(Color.DARK_GRAY);
  223.     }
  224.    
  225.     // 更新怪物位置
  226.     public void updateMonsterPosition(int monsterId, int x, int y) {
  227.         for (MonsterInfo info : monsterInfos) {
  228.             if (info.id == monsterId) {
  229.                 info.x = x;
  230.                 info.y = y;
  231.                 repaint();
  232.                 return;
  233.             }
  234.         }
  235.     }
  236.    
  237.     // 添加怪物到小地图
  238.     public void addMonster(int monsterId, int x, int y, int type, String name) {
  239.         monsterInfos.add(new MonsterInfo(monsterId, x, y, type, name));
  240.         repaint();
  241.     }
  242.    
  243.     // 移除怪物(当怪物死亡时)
  244.     public void removeMonster(int monsterId) {
  245.         monsterInfos.removeIf(info -> info.id == monsterId);
  246.         repaint();
  247.     }
  248.    
  249.     @Override
  250.     protected void paintComponent(Graphics g) {
  251.         super.paintComponent(g);
  252.         Graphics2D g2d = (Graphics2D) g;
  253.         
  254.         // 绘制小地图背景
  255.         g2d.setColor(new Color(50, 50, 50));
  256.         g2d.fillRect(25, 25, minimapSize, minimapSize);
  257.         
  258.         // 绘制小地图边框
  259.         g2d.setColor(Color.WHITE);
  260.         g2d.drawRect(25, 25, minimapSize, minimapSize);
  261.         
  262.         // 绘制玩家位置(中心点)
  263.         g2d.setColor(Color.GREEN);
  264.         int playerMapX = minimapSize / 2 + 25;
  265.         int playerMapY = minimapSize / 2 + 25;
  266.         g2d.fillOval(playerMapX - 5, playerMapY - 5, 10, 10);
  267.         g2d.setColor(Color.WHITE);
  268.         g2d.drawString("玩家", playerMapX - 10, playerMapY - 10);
  269.         
  270.         // 绘制怪物红点
  271.         for (MonsterInfo monster : monsterInfos) {
  272.             if (monster.type == 0) continue; // 不显示的怪物
  273.             
  274.             // 计算怪物在小地图上的相对位置
  275.             int monsterMapX = 25 + (int)((monster.x - (playerX - viewRange / 2)) *
  276.                 minimapSize / viewRange);
  277.             int monsterMapY = 25 + (int)((monster.y - (playerY - viewRange / 2)) *
  278.                 minimapSize / viewRange);
  279.             
  280.             // 只显示在视野范围内的怪物
  281.             if (monsterMapX >= 25 && monsterMapX <= 25 + minimapSize &&
  282.                 monsterMapY >= 25 && monsterMapY <= 25 + minimapSize) {
  283.                
  284.                 // 根据类型设置颜色
  285.                 switch (monster.type) {
  286.                     case 1: // 红点(普通主动怪)
  287.                         g2d.setColor(Color.RED);
  288.                         break;
  289.                     case 2: // 黄点(被动怪)
  290.                         g2d.setColor(Color.YELLOW);
  291.                         break;
  292.                     case 3: // BOSS(大红色)
  293.                         g2d.setColor(new Color(255, 0, 0, 200));
  294.                         g2d.fillOval(monsterMapX - 8, monsterMapY - 8, 16, 16);
  295.                         g2d.setColor(Color.WHITE);
  296.                         g2d.drawString("BOSS", monsterMapX - 15, monsterMapY - 15);
  297.                         continue;
  298.                 }
  299.                
  300.                 // 绘制怪物点
  301.                 g2d.fillOval(monsterMapX - 4, monsterMapY - 4, 8, 8);
  302.                
  303.                 // 绘制怪物名称(简化显示)
  304.                 if (monster.type == 1) {
  305.                     g2d.setColor(Color.WHITE);
  306.                     g2d.drawString(monster.name.substring(0, Math.min(3, monster.name.length())),
  307.                         monsterMapX - 5, monsterMapY - 10);
  308.                 }
  309.             }
  310.         }
  311.         
  312.         // 绘制图例
  313.         g2d.setColor(Color.WHITE);
  314.         g2d.drawString("小地图图例:", 25, minimapSize + 50);
  315.         g2d.setColor(Color.GREEN);
  316.         g2d.fillOval(80, minimapSize + 45, 8, 8);
  317.         g2d.setColor(Color.WHITE);
  318.         g2d.drawString("玩家", 95, minimapSize + 52);
  319.         
  320.         g2d.setColor(Color.RED);
  321.         g2d.fillOval(140, minimapSize + 45, 8, 8);
  322.         g2d.setColor(Color.WHITE);
  323.         g2d.drawString("主动怪", 155, minimapSize + 52);
  324.         
  325.         g2d.setColor(Color.YELLOW);
  326.         g2d.fillOval(210, minimapSize + 45, 8, 8);
  327.         g2d.setColor(Color.WHITE);
  328.         g2d.drawString("被动怪", 225, minimapSize + 52);
  329.     }
  330. }

  331. // 6. 客户端类 - 接收服务器封包并更新小地图
  332. class Client {
  333.     private final MiniMapPanel minimap;
  334.     private final String playerName;
  335.    
  336.     public Client(String playerName, MiniMapPanel minimap) {
  337.         this.playerName = playerName;
  338.         this.minimap = minimap;
  339.     }
  340.    
  341.     // 接收服务器封包并处理
  342.     public void receivePacket(Object packet) {
  343.         if (packet instanceof S_NPCPack) {
  344.             S_NPCPack npcPack = (S_NPCPack) packet;
  345.             if (npcPack.getMinimapType() > 0) {
  346.                 minimap.addMonster(npcPack.getMonsterId(),
  347.                     npcPack.getX(), npcPack.getY(),
  348.                     npcPack.getMinimapType(), "怪物" + npcPack.getMonsterId());
  349.                 System.out.println("客户端收到怪物出现: ID=" + npcPack.getMonsterId());
  350.             }
  351.         } else if (packet instanceof S_MoveNpcPacket) {
  352.             S_MoveNpcPacket movePacket = (S_MoveNpcPacket) packet;
  353.             minimap.updateMonsterPosition(movePacket.getMonsterId(),
  354.                 movePacket.getNewX(), movePacket.getNewY());
  355.             System.out.println("客户端收到怪物移动: ID=" + movePacket.getMonsterId() +
  356.                              " -> (" + movePacket.getNewX() + "," + movePacket.getNewY() + ")");
  357.         }
  358.     }
  359. }

  360. // 7. 主程序 - 模拟游戏运行
  361. public class MonsterMinimapSystem {
  362.     private static GameServer server;
  363.     private static MiniMapPanel minimap;
  364.     private static JFrame frame;
  365.    
  366.     public static void main(String[] args) {
  367.         // 初始化服务器
  368.         server = new GameServer();
  369.         
  370.         // 创建小地图UI
  371.         minimap = new MiniMapPanel();
  372.         
  373.         // 创建客户端
  374.         Client client = new Client("测试玩家", minimap);
  375.         server.addClient(client);
  376.         
  377.         // 创建并显示UI
  378.         SwingUtilities.invokeLater(() -> {
  379.             frame = new JFrame("怪物小地图红点显示系统");
  380.             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  381.             frame.setLayout(new BorderLayout());
  382.             
  383.             // 信息面板
  384.             JPanel infoPanel = new JPanel();
  385.             infoPanel.setLayout(new FlowLayout());
  386.             JLabel infoLabel = new JLabel("模拟所有怪物在小地图显示为红点,红点实时跟随怪物移动");
  387.             infoPanel.add(infoLabel);
  388.             
  389.             // 控制面板
  390.             JPanel controlPanel = new JPanel();
  391.             JButton addMonsterBtn = new JButton("添加新怪物");
  392.             JButton startSimulationBtn = new JButton("开始模拟移动");
  393.             controlPanel.add(addMonsterBtn);
  394.             controlPanel.add(startSimulationBtn);
  395.             
  396.             // 按钮事件
  397.             addMonsterBtn.addActionListener(e -> {
  398.                 // 随机生成怪物
  399.                 Random rand = new Random();
  400.                 int x = rand.nextInt(server.getMapWidth());
  401.                 int y = rand.nextInt(server.getMapHeight());
  402.                 boolean aggressive = rand.nextBoolean();
  403.                 boolean boss = rand.nextInt(10) == 0; // 10%几率生成BOSS
  404.                 int level = rand.nextInt(50) + 1;
  405.                
  406.                 String name = (boss ? "BOSS_" : "") +
  407.                              (aggressive ? "主动怪" : "被动怪") + "_Lv" + level;
  408.                
  409.                 Monster monster = new Monster(x, y, name, level, aggressive, boss);
  410.                 server.addMonster(monster);
  411.                
  412.                 System.out.println("添加新怪物: " + name + " 位置=(" + x + "," + y + ")");
  413.             });
  414.             
  415.             startSimulationBtn.addActionListener(e -> {
  416.                 startMonsterMovementSimulation();
  417.             });
  418.             
  419.             // 添加到框架
  420.             frame.add(infoPanel, BorderLayout.NORTH);
  421.             frame.add(minimap, BorderLayout.CENTER);
  422.             frame.add(controlPanel, BorderLayout.SOUTH);
  423.             
  424.             frame.pack();
  425.             frame.setLocationRelativeTo(null);
  426.             frame.setVisible(true);
  427.             
  428.             // 初始添加一些怪物
  429.             initializeMonsters();
  430.         });
  431.     }
  432.    
  433.     private static void initializeMonsters() {
  434.         // 添加初始怪物
  435.         server.addMonster(new Monster(2300, 2400, "狼", 5, true, false));
  436.         server.addMonster(new Monster(2600, 2500, "史莱姆", 3, false, false));
  437.         server.addMonster(new Monster(2400, 2600, "哥布林", 8, true, false));
  438.         server.addMonster(new Monster(2700, 2300, "龙", 45, true, true)); // BOSS
  439.         server.addMonster(new Monster(2200, 2700, "鹿", 2, false, false));
  440.         
  441.         System.out.println("初始化完成,添加了5个怪物(包含1个BOSS)");
  442.     }
  443.    
  444.     private static void startMonsterMovementSimulation() {
  445.         Thread simulationThread = new Thread(() -> {
  446.             try {
  447.                 System.out.println("开始模拟怪物移动...");
  448.                 for (int i = 0; i < 100; i++) { // 模拟100次移动
  449.                     server.updateMonsterPositions();
  450.                     Thread.sleep(1000); // 每秒移动一次
  451.                     
  452.                     // 更新UI
  453.                     SwingUtilities.invokeLater(() -> {
  454.                         minimap.repaint();
  455.                     });
  456.                 }
  457.                 System.out.println("模拟结束");
  458.             } catch (InterruptedException e) {
  459.                 e.printStackTrace();
  460.             }
  461.         });
  462.         simulationThread.setDaemon(true);
  463.         simulationThread.start();
  464.     }
  465. }
複製代碼

这是ai写的

回復 支持 反對

使用道具 舉報

132

主題

1497

帖子

1萬

金錢

巴列斯

Rank: 10Rank: 10Rank: 10

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
60
積分
15042
在線時間
104 小時
相冊
1
日誌
0
好友
1
 樓主| 發表於 2025-12-24 17:35 | 顯示全部樓層

摇一摇一摇

回復 支持 反對

使用道具 舉報

132

主題

1497

帖子

1萬

金錢

巴列斯

Rank: 10Rank: 10Rank: 10

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
60
積分
15042
在線時間
104 小時
相冊
1
日誌
0
好友
1
 樓主| 發表於 2025-12-24 18:10 | 顯示全部樓層

摇一摇一摇

回復 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊會員

本版積分規則

天堂私服列表

45客服

Archiver| 45天堂私服論壇   分享到微博! 分享到臉書! 分享到噗浪! 分享到維特! 分享到Google+! 分享到LINE!

45天堂私服發佈站 ©    天堂私服架設教學  提供最新天堂私服最新資訊

流量最高、品質最好、服務最優、玩家首選、最新天堂私服資訊,都在45天堂私服發佈站.    免責聲明

Sitetag
line客服聯繫
掃一掃二碼
Line客服聯繫
24H專人回覆
返回頂部 返回列表