找回密码
 立即注册

QQ登录

只需一步,快速开始

游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
广告位招租 联系QQ51605539 今日新开 进入游戏
非官方wiki 芙蕾雅NPC-技能-道具数据库 永久可用 血玫瑰社区 进入游戏
天堂2协议 天堂2客户端协议附带英文客户端下载 不定期更新 L2FATER 进入游戏
Close
查看: 58|回复: 0

542 猜拳==剪刀/石頭/布

[复制链接]
  • 打卡总天数:32
  • 打卡总奖励:246
发表于 7 天前 | 显示全部楼层 |阅读模式
  1. package quests.Q99001_MidAutumnRPS;

  2. import java.util.Map;
  3. import java.util.concurrent.ConcurrentHashMap;

  4. import org.l2jmobius.gameserver.handler.CommunityBoardHandler;
  5. import org.l2jmobius.gameserver.handler.IParseBoardHandler;
  6. import org.l2jmobius.commons.util.Rnd;
  7. import org.l2jmobius.gameserver.entity.actor.Npc;
  8. import org.l2jmobius.gameserver.entity.actor.Player;
  9. import org.l2jmobius.gameserver.mechanics.script.Quest;
  10. import org.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
  11. import org.l2jmobius.gameserver.network.serverpackets.NpcQuestHtmlMessage;
  12. import org.l2jmobius.gameserver.entity.item.enums.ItemProcessType;

  13. public class Q99001_MidAutumnRPS extends Quest implements IParseBoardHandler
  14. {
  15.         private static final int EVENT_NPC_ID = 99001; // 常駐 NPCID
  16.         private static final int REWARD_ITEM_ID = 57;   // 基礎獎勵:天幣
  17.         private static final int REQ_ITEM_ID = 6673;    // 門票:ID
  18.         private static final int REQ_ITEM_COUNT = 1;    // 每次遊玩消耗數量

  19.         // =================================*********
  20.         // 在這裡修改「3連勝額外大獎」的內容,改完直接熱重載!
  21.         // ====================================******
  22.         private static final int BONUS_ITEM_ID = 82903;     // 3連勝額外大獎道具 ID
  23.         private static final int BONUS_ITEM_COUNT = 50; // 3連勝額外大獎贈送的數量

  24.         // 內核雲端資料庫 Key 標籤字串
  25.         private static final String STREAK_VAR = "RPS_STREAK_COUNT";

  26.         // 常駐型防刷記憶體資料庫
  27.         private static final Map<Integer, Integer> playerDailyCount = new ConcurrentHashMap<>();
  28.         private static final Map<Integer, Long> playerCooldown = new ConcurrentHashMap<>();
  29.         private static final Map<String, Integer> ipDailyCount = new ConcurrentHashMap<>();

  30.         public Q99001_MidAutumnRPS()
  31.         {
  32.                 super(99001);
  33.                 addStartNpc(EVENT_NPC_ID);
  34.                 addTalkId(EVENT_NPC_ID);
  35.                 addFirstTalkId(EVENT_NPC_ID);
  36.                
  37.                 // 將自己動態登記到內核中央看板處理名單中
  38.                 CommunityBoardHandler.getInstance().registerHandler(this);
  39.         }

  40.         @Override
  41.         public String getName()
  42.         {
  43.                 return "Q99001_MidAutumnRPS";
  44.         }

  45.         // 白名單免驗證指令收集
  46.         public String[] getCommandList()
  47.         {
  48.                 return new String[] { "_bbs?midautumn_play_1", "_bbs?midautumn_play_2", "_bbs?midautumn_play_3", "_bbs?midautumn_window" };
  49.         }

  50.         // 白名單中央分發處理器
  51.         public boolean onCommand(String command, Player player)
  52.         {
  53.                 Npc lastNpc = player.getLastFolkNPC();
  54.                 onEvent(command, lastNpc, player);
  55.                 return true;
  56.         }

  57.         @Override
  58.         public String onFirstTalk(Npc npc, Player player)
  59.         {
  60.                 int played = playerDailyCount.getOrDefault(player.getObjectId(), 0);
  61.                 NpcQuestHtmlMessage html = new NpcQuestHtmlMessage(npc != null ? npc.getObjectId() : 0, 99001);
  62.                 html.setFile(player, "data/html/default/99001.htm");
  63.                 html.replace("%played_times%", String.valueOf(played));
  64.                 player.sendPacket(html);
  65.                 return "";
  66.         }

  67.         @Override
  68.         public String onEvent(String event, Npc npc, Player player)
  69.         {
  70.                 if (event.contains("midautumn_play") || event.contains("rps_play") || event.contains("midautumn_window") || event.contains("rps_window"))
  71.                 {
  72.                         Npc realNpc = (npc != null) ? npc : player.getLastFolkNPC();
  73.                         int npcObjId = (realNpc != null) ? realNpc.getObjectId() : 0;

  74.                         // 如果是玩家點擊【再玩一局】返回主視窗
  75.                         if (event.contains("midautumn_window") || event.contains("rps_window"))
  76.                         {
  77.                                 NpcHtmlMessage html = new NpcHtmlMessage(npcObjId);
  78.                                 html.setFile(player, "data/html/default/99001.htm");
  79.                                 html.replace("%played_times%", String.valueOf(playerDailyCount.getOrDefault(player.getObjectId(), 0)));
  80.                                 player.sendPacket(html);
  81.                                 return "";
  82.                         }

  83.                         // 以下為猜拳遊玩核心邏輯
  84.                         int playerChoice = 1;
  85.                         if (event.contains("1")) { playerChoice = 1; }
  86.                         else if (event.contains("2")) { playerChoice = 2; }
  87.                         else if (event.contains("3")) { playerChoice = 3; }
  88.                        
  89.                         boolean isGM = player.isGM();

  90.                         if (!isGM)
  91.                         {
  92.                                 int played = playerDailyCount.getOrDefault(player.getObjectId(), 0);
  93.                                 if (played >= 6)
  94.                                 {
  95.                                         player.sendMessage("您今天已經玩過 6 次了,請明天再來!");
  96.                                         return null;
  97.                                 }

  98.                                 long lastPlay = playerCooldown.getOrDefault(player.getObjectId(), 0L);
  99.                                 if ((System.currentTimeMillis() - lastPlay) < 3000)
  100.                                 {
  101.                                         player.sendMessage("每局防刷間隔為 3 秒!");
  102.                                         return null;
  103.                                 }

  104.                                 String playerIP = "127.0.0.1";
  105.                                 if (player.getClient() != null)
  106.                                 {
  107.                                         playerIP = player.getClient().getIp() != null ? player.getClient().getIp() : "127.0.0.1";
  108.                                 }
  109.                               
  110.                                 int ipPlayed = ipDailyCount.getOrDefault(playerIP, 0);
  111.                                 if (ipPlayed >= 20)
  112.                                 {
  113.                                         player.sendMessage("您所在的 IP 今日遊玩次數已達上限!");
  114.                                         return null;
  115.                                 }

  116.                                 if (player.getInventory().getInventoryItemCount(REQ_ITEM_ID, -1) < REQ_ITEM_COUNT)
  117.                                 {
  118.                                         player.sendMessage("您身上沒有足夠的 [慶典金幣]!");
  119.                                         return null;
  120.                                 }
  121.                         }

  122.                         if (!isGM)
  123.                         {
  124.                                 if (!player.destroyItemByItemId(ItemProcessType.FEE, REQ_ITEM_ID, REQ_ITEM_COUNT, realNpc, true))
  125.                                 {
  126.                                         player.sendMessage("扣除門票失敗,請重新再試。");
  127.                                         return null;
  128.                                 }

  129.                                 playerCooldown.put(player.getObjectId(), System.currentTimeMillis());
  130.                                 playerDailyCount.put(player.getObjectId(), playerDailyCount.getOrDefault(player.getObjectId(), 0) + 1);

  131.                                 String playerIP = "127.0.0.1";
  132.                                 if (player.getClient() != null)
  133.                                 {
  134.                                         playerIP = player.getClient().getIp() != null ? player.getClient().getIp() : "127.0.0.1";
  135.                                 }
  136.                                 ipDailyCount.put(playerIP, ipDailyCount.getOrDefault(playerIP, 0) + 1);
  137.                         }

  138.                         int npcChoice = Rnd.get(1, 3);
  139.                         String rpsResult;
  140.                        
  141.                         // 從玩家內核記憶體撈出當前連勝次數
  142.                         int currentStreak = player.getVariables().getInt(STREAK_VAR, 0);

  143.                         if (playerChoice == npcChoice)
  144.                         {
  145.                                 // 指示:平手時,連勝次數「維持不變」!不增加也不扣除,門票退回與否看原基礎邏輯
  146.                                 rpsResult = "<font color="LEVEL">平手!</font>門票已消耗,目前維持 " + currentStreak + " 連勝,再來一局吧!";
  147.                         }
  148.                         else if ((playerChoice == 1 && npcChoice == 3) || (playerChoice == 2 && npcChoice == 1) || (playerChoice == 3 && npcChoice == 2))
  149.                         {
  150.                                 // 玩家贏了!連勝次數 + 1
  151.                                 currentStreak++;
  152.                                 player.getVariables().set(STREAK_VAR, currentStreak);
  153.                                 player.getVariables().saveNow(); // 鎖死進內核資料庫

  154.                                 rpsResult = "<font color="00FF00">恭喜你贏了!</font><br>目前已達成 <font color="FF9900">" + currentStreak + "</font> 連勝!";
  155.                               
  156.                                 // 發放常規猜拳勝場獎勵
  157.                                 int[] rewards = {10000, 100000, 1000000};
  158.                                 int rewardCount = rewards[Rnd.get(rewards.length)];
  159.                                 player.addItem(ItemProcessType.REWARD, REWARD_ITEM_ID, rewardCount, realNpc, true);
  160.                               
  161.                                 // 當連勝次數剛好累積到 3 次的倍數時,發放豪華加碼連勝大獎!
  162.                                 if (currentStreak > 0 && currentStreak % 3 == 0)
  163.                                 {
  164.                                         player.addItem(ItemProcessType.REWARD, BONUS_ITEM_ID, BONUS_ITEM_COUNT, realNpc, true);
  165.                                         rpsResult += "<br><font color="FFFF00">終極大爆發!達成 " + currentStreak + " 連勝加碼獎勵已發放!</font>";
  166.                                        
  167.                                         // 系統全服公告
  168.                                         player.sendMessage("【連勝神話】恭喜您達成 " + currentStreak + " 連勝,獲得特別加碼大獎!");
  169.                                 }
  170.                         }
  171.                         else
  172.                         {
  173.                                 // 玩家輸了:連勝次數無情歸零!
  174.                                 currentStreak = 0;
  175.                                 player.getVariables().set(STREAK_VAR, 0);
  176.                                 player.getVariables().saveNow();
  177.                               
  178.                                 rpsResult = "<font color="FF0000">好可惜,你輸了!</font>連勝紀錄已中斷歸零,再接再厲!";
  179.                         }

  180.                         NpcQuestHtmlMessage html = new NpcQuestHtmlMessage(npcObjId, 99001);
  181.                         html.setFile(player, "data/html/default/99001-result.htm");
  182.                         html.replace("%player_choice%", getChoiceName(playerChoice));
  183.                         html.replace("%npc_choice%", getChoiceName(npcChoice));
  184.                         html.replace("%rps_result%", rpsResult);
  185.                         player.sendPacket(html);
  186.                         return "";
  187.                 }
  188.                 return null;
  189.         }

  190.         private static String getChoiceName(int choice)
  191.         {
  192.                 if (choice == 1) return "剪刀";
  193.                 if (choice == 2) return "石頭";
  194.                 return "布";
  195.         }

  196.         public static void main(String[] args)
  197.         {
  198.                 new Q99001_MidAutumnRPS();
  199.                 System.out.println("==================================");
  200.                 System.out.println("[Script] 歡樂連勝猜拳常駐娛樂系統");
  201.                 System.out.println("==================================");
  202.         }
  203. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表