package mod.sin.wyvern; import com.wurmonline.server.Server; import com.wurmonline.server.ServerEntry; import com.wurmonline.server.creatures.Creature; import com.wurmonline.server.economy.Economy; import com.wurmonline.server.epic.Hota; import com.wurmonline.server.items.*; import com.wurmonline.server.players.Player; import com.wurmonline.server.questions.NewSpawnQuestion; import com.wurmonline.server.questions.SpawnQuestion; import com.wurmonline.server.skills.Affinity; import com.wurmonline.server.villages.Citizen; import com.wurmonline.server.villages.Village; import com.wurmonline.server.zones.Zone; import com.wurmonline.server.zones.Zones; import javassist.ClassPool; import javassist.CtClass; import javassist.NotFoundException; import javassist.bytecode.Descriptor; import mod.sin.items.AffinityOrb; import mod.sin.items.KeyFragment; import mod.sin.items.caches.*; import mod.sin.lib.Util; import org.gotti.wurmunlimited.modloader.classhooks.HookException; import org.gotti.wurmunlimited.modloader.classhooks.HookManager; import java.util.logging.Logger; public class Arena { public static Logger logger = Logger.getLogger(Arena.class.getName()); public static byte getArenaAttitude(Player player, Creature aTarget){ if (player.getPower() > 0) { if (player.getPower() >= 5) { return 6; } return 3; } if (player == aTarget){ return 1; } if (player.opponent == aTarget) { return 2; } if (player.getSaveFile().pet != -10 && aTarget.getWurmId() == player.getSaveFile().pet) { return 1; } if (aTarget.getDominator() != null && aTarget.getDominator() != player) { return player.getAttitude(aTarget.getDominator()); } if (aTarget.isReborn() && player.getKingdomTemplateId() == 3) { return 0; } if (aTarget.hasAttackedUnmotivated() && (aTarget.isPlayer() || !aTarget.isDominated() || aTarget.getDominator() != player)) { return 2; } if (aTarget.citizenVillage != null && player.citizenVillage != null) { if (player.citizenVillage.isCitizen(aTarget)) { return 1; } if (player.citizenVillage.isAlly(aTarget)) { return 1; } } if (aTarget.isPlayer() && player.getTeam() != null && player.getTeam().contains(aTarget)){ return 1; } if (aTarget.isPlayer() && player.isFriend(aTarget.getWurmId())) { return 1; } if (aTarget.isPlayer()){ return 2; } if (aTarget.isAggHuman()) { return 2; } return 0; } public static void sendNewSpawnQuestion(SpawnQuestion sq){ NewSpawnQuestion nsq = new NewSpawnQuestion(sq.getResponder(), "Respawn", "Where would you like to spawn?", sq.getResponder().getWurmId()); nsq.sendQuestion(); } public static void createNewHotaPrize(Village v, int winStreak){ try { Item lump; int x; Item statue = ItemFactory.createItem(ItemList.statueHota, 99.0f, null); byte material = Materials.MATERIAL_GOLD; if (winStreak > 30) { material = Materials.MATERIAL_ADAMANTINE; }else if (winStreak > 20) { material = Materials.MATERIAL_GLIMMERSTEEL; }else if (winStreak > 10) { material = Materials.MATERIAL_DIAMOND; }else if (winStreak > 5) { material = Materials.MATERIAL_CRYSTAL; } statue.setMaterial(material); float posX = v.getToken().getPosX() - 2.0f + Server.rand.nextFloat() * 4.0f; float posY = v.getToken().getPosY() - 2.0f + Server.rand.nextFloat() * 4.0f; statue.setPosXYZRotation(posX, posY, Zones.calculateHeight(posX, posY, true), Server.rand.nextInt(350)); for (int i = 0; i < winStreak; ++i) { if (i / 11 == winStreak % 11) { statue.setAuxData((byte) 0); statue.setData1(1); continue; } statue.setAuxData((byte)winStreak); } int r = winStreak * 50 & 255; int g = 0; int b = 0; if (winStreak > 5 && winStreak < 16) { r = 0; } if (winStreak > 5 && winStreak < 20) { g = winStreak * 50 & 255; } if (winStreak > 5 && winStreak < 30) { b = winStreak * 50 & 255; } statue.setColor(WurmColor.createColor(r, g, b)); statue.getColor(); Zone z = Zones.getZone(statue.getTileX(), statue.getTileY(), true); int numHelpers = 0; for (Citizen c : v.citizens.values()) { if (Hota.getHelpValue(c.getId()) <= 0) continue; ++numHelpers; } numHelpers = Math.min(5, numHelpers); for (x = 0; x < numHelpers; ++x) { Item sleepPowder = ItemFactory.createItem(ItemList.sleepPowder, 99f, null); statue.insertItem(sleepPowder, true); } for (x = 0; x < 5; ++x) { lump = ItemFactory.createItem(ItemList.adamantineBar, Math.min(99f, 60 + (winStreak*Server.rand.nextFloat()*1.5f)), null); float baseWeight = lump.getWeightGrams(); float multiplier = 1f;//+(winStreak*0.4f*Server.rand.nextFloat()); lump.setWeight((int) (baseWeight*multiplier), true); statue.insertItem(lump, true); } for (x = 0; x < 5; ++x) { lump = ItemFactory.createItem(ItemList.glimmerSteelBar, Math.min(99f, 60 + (winStreak*Server.rand.nextFloat()*1.5f)), null); float baseWeight = lump.getWeightGrams(); float multiplier = 1f;//+(winStreak*0.2f*Server.rand.nextFloat()); lump.setWeight((int) (baseWeight*multiplier), true); statue.insertItem(lump, true); } // Key fragment Item keyFragment = ItemFactory.createItem(KeyFragment.templateId, 99f, null); statue.insertItem(keyFragment, true); // Add affinity orb Item affinityOrb = ItemFactory.createItem(AffinityOrb.templateId, 99f, null); statue.insertItem(affinityOrb, true); // Add 5 medium-quality caches int[] cacheIds = { ArtifactCache.templateId, CrystalCache.templateId, CrystalCache.templateId, DragonCache.templateId, DragonCache.templateId, DragonCache.templateId, RiftCache.templateId, RiftCache.templateId, RiftCache.templateId, ToolCache.templateId, TreasureMapCache.templateId }; int i = 5+Server.rand.nextInt(4); // 5-8 caches. while(i > 0){ Item cache = ItemFactory.createItem(cacheIds[Server.rand.nextInt(cacheIds.length)], 40f+(50f*Server.rand.nextFloat()), ""); statue.insertItem(cache, true); i--; } i = 10+Server.rand.nextInt(11); // 10 - 20 kingdom tokens while(i > 0){ Item token = ItemFactory.createItem(22765, 40f+(50f*Server.rand.nextFloat()), ""); statue.insertItem(token, true); i--; } // Add 3-5 seryll lumps of medium ql i = 3+Server.rand.nextInt(3); // 3-5 lumps while(i > 0){ Item seryll = ItemFactory.createItem(ItemList.seryllBar, 40f+(60f*Server.rand.nextFloat()), null); statue.insertItem(seryll, true); i--; } // Add 2-4 silver long iron = 20000; // 2 silver iron += Server.rand.nextInt(20000); // add up to 2 more silver Item[] coins = Economy.getEconomy().getCoinsFor(iron); for(Item coin : coins){ statue.insertItem(coin, true); } z.addItem(statue); } catch (Exception ex) { logger.warning(ex.getMessage()); } } public static void respawnPlayer(Creature player, ServerEntry server){ ServerEntry targetserver = server.serverWest; if(player instanceof Player){ Player p = (Player) player; int tilex = targetserver.SPAWNPOINTJENNX; int tiley = targetserver.SPAWNPOINTJENNY; p.sendTransfer(Server.getInstance(), targetserver.INTRASERVERADDRESS, Integer.parseInt(targetserver.INTRASERVERPORT), targetserver.INTRASERVERPASSWORD, targetserver.id, tilex, tiley, true, false, p.getKingdomId()); } } public static Affinity[] getNullAffinities(){ return new Affinity[0]; } public static void preInit(){ try { ClassPool classPool = HookManager.getInstance().getClassPool(); Class thisClass = Arena.class; String replace; // - Allow horse gear to be added/removed from horses without branding or taming (PvP Only) - // CtClass ctCommunicator = classPool.get("com.wurmonline.server.creatures.Communicator"); replace = "if(this.player.getPower() > 0){" + " $_ = this.player;" + "}else if(com.wurmonline.server.Servers.isThisAPvpServer() && owner.getDominator() != this.player){" + " $_ = owner.getLeader();" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctCommunicator, "reallyHandle_CMD_MOVE_INVENTORY", "getDominator", replace); Util.instrumentDeclared(thisClass, ctCommunicator, "equipCreatureCheck", "getDominator", replace); /*ctCommunicator.getDeclaredMethod("reallyHandle_CMD_MOVE_INVENTORY").instrument(new ExprEditor(){ public void edit(MethodCall m) throws CannotCompileException { if (m.getMethodName().equals("getDominator")) { m.replace("if(com.wurmonline.server.Servers.isThisAPvpServer() && owner.getDominator() != this.player){" + " $_ = owner.getLeader();" + "}else{" + " if(this.player.getPower() > 0){" + " $_ = this.player;" + " }else{" + " $_ = $proceed($$);" + " }" + "}"); return; } } });*/ // - Allow lockpicking on PvP server, as well as treasure chests on PvE - // CtClass ctItemBehaviour = classPool.get("com.wurmonline.server.behaviours.ItemBehaviour"); CtClass ctAction = classPool.get("com.wurmonline.server.behaviours.Action"); CtClass ctCreature = classPool.get("com.wurmonline.server.creatures.Creature"); CtClass ctItem = classPool.get("com.wurmonline.server.items.Item"); CtClass[] params1 = { ctAction, ctCreature, ctItem, ctItem, CtClass.shortType, CtClass.floatType }; String desc1 = Descriptor.ofMethod(CtClass.booleanType, params1); Util.setReason("Allow lockpicking on the PvP server and improve PvE treasure chest lockpicking."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " $_ = true;" + "}else{" + " $_ = target.getLastOwnerId() == -10 || target.getLastOwnerId() == 0 || target.getTemplateId() == 995;" + "}"; Util.instrumentDescribed(thisClass, ctItemBehaviour, "action", desc1, "isInPvPZone", replace); CtClass ctMethodsItems = classPool.get("com.wurmonline.server.behaviours.MethodsItems"); replace = "$_ = $proceed($$);" + "if($_ == -10 || $_ == 0){ ok = true; }"; Util.instrumentDeclared(thisClass, ctMethodsItems, "picklock", "getLastOwnerId", replace); /*ctMethodsItems.getDeclaredMethod("picklock").instrument(new ExprEditor(){ public void edit(MethodCall m) throws CannotCompileException { if (m.getMethodName().equals("getLastOwnerId")) { m.replace("$_ = $proceed($$);" + "if($_ == -10 || $_ == 0){ ok = true; }"); return; } } });*/ // - Disable villages and PMK's on the PvP server - // CtClass ctVillageFoundationQuestion = classPool.get("com.wurmonline.server.questions.VillageFoundationQuestion"); Util.setReason("Allow placing deed outside of kingdom border."); replace = "$_ = (byte) 4;"; Util.instrumentDeclared(thisClass, ctVillageFoundationQuestion, "checkSize", "getKingdom", replace); CtClass ctKingdomFoundationQuestion = classPool.get("com.wurmonline.server.questions.KingdomFoundationQuestion"); Util.setReason("Disable PMK's on the Arena server."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " this.getResponder().getCommunicator().sendSafeServerMessage(\"Player-Made Kingdoms are disabled on this server.\");" + " return;" + "}"; Util.insertBeforeDeclared(thisClass, ctKingdomFoundationQuestion, "sendQuestion", replace); // - Disable champion players altogether - // CtClass ctRealDeathQuestion = classPool.get("com.wurmonline.server.questions.RealDeathQuestion"); Util.setReason("Disable player champions."); replace = "this.getResponder().getCommunicator().sendSafeServerMessage(\"Champion players are disabled on this server.\");" + "return;"; Util.insertBeforeDeclared(thisClass, ctRealDeathQuestion, "sendQuestion", replace); // - Re-sort player aggression on the PvP server - // CtClass ctPlayer = classPool.get("com.wurmonline.server.players.Player"); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " return "+Arena.class.getName()+".getArenaAttitude(this, $1);" + "}"; Util.insertBeforeDeclared(thisClass, ctPlayer, "getAttitude", replace); Util.setReason("Re-sort creature-player aggression on the PvP server."); replace = "" + "if(com.wurmonline.server.Servers.localServer.PVPSERVER && ($1.isPlayer() || this.isPlayer())){" + " if($1.citizenVillage != null && this.citizenVillage != null){" + " if($1.citizenVillage == this.citizenVillage){" + " return 1;" + " }" + " if($1.citizenVillage.isAlly(this.citizenVillage)){" + " return 1;" + " }" + " }" + "}"; Util.insertBeforeDeclared(thisClass, ctCreature, "getAttitude", replace); // - Hook for (ENEMY) declaration to allow for enemy presence blocking - // CtClass ctVirtualZone = classPool.get("com.wurmonline.server.zones.VirtualZone"); CtClass[] params2 = { CtClass.longType, CtClass.booleanType, CtClass.longType, CtClass.floatType, CtClass.floatType, CtClass.floatType }; String desc2 = Descriptor.ofMethod(CtClass.booleanType, params2); replace = "if(this.watcher.isPlayer()){" + " if("+PlayerTitles.class.getName()+".hasCustomTitle(creature)){" + " suff = suff + "+PlayerTitles.class.getName()+".getCustomTitle(creature);" + " }" + " if(com.wurmonline.server.Servers.localServer.PVPSERVER && creature.isPlayer() && "+Arena.class.getName()+".getArenaAttitude((com.wurmonline.server.players.Player)this.watcher, creature) == 2){" + " suff = suff + \" (ENEMY)\";" + " enemy = true;" + " }" + "}" + "$_ = $proceed($$);"; Util.instrumentDescribed(thisClass, ctVirtualZone, "addCreature", desc2, "isChampion", replace); // - Modify when an enemy is present or not to use attitude instead of kingdom - // replace = "if(this.watcher.isPlayer() && creature.isPlayer() && com.wurmonline.server.Servers.localServer.PVPSERVER && "+Arena.class.getName()+".getArenaAttitude((com.wurmonline.server.players.Player)this.watcher, creature) == 2){" + " $_ = 1;" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctVirtualZone, "checkIfEnemyIsPresent", "getKingdomId", replace); /*ctVirtualZone.getDeclaredMethod("checkIfEnemyIsPresent").instrument(new ExprEditor(){ public void edit(MethodCall m) throws CannotCompileException { if (m.getMethodName().equals("getKingdomId")) { m.replace("if(this.watcher.isPlayer() && creature.isPlayer() && com.wurmonline.server.Servers.localServer.PVPSERVER && mod.sin.wyvern.Arena.getArenaAttitude((com.wurmonline.server.players.Player)this.watcher, creature) == 2){" + " $_ = 1;" + "}else{" + " $_ = $proceed($$);" + "}"); return; } } });*/ // - Block twigs and stones on the PvP server - // CtClass ctMethodsCreatures = classPool.get("com.wurmonline.server.behaviours.MethodsCreatures"); Util.setReason("Block farwalker twigs and stones on PvP."); replace = "$_ = com.wurmonline.server.Servers.localServer.PVPSERVER;"; Util.instrumentDeclared(thisClass, ctMethodsCreatures, "teleportCreature", "isInPvPZone", replace); /*ctMethodsCreatures.getDeclaredMethod("teleportCreature").instrument(new ExprEditor(){ public void edit(MethodCall m) throws CannotCompileException { if (m.getMethodName().equals("isInPvPZone")) { m.replace("$_ = com.wurmonline.server.Servers.localServer.PVPSERVER;"); return; } } });*/ // - After respawn on PvP, send directly to PvE server - // /*CtClass ctSpawnQuestion = classPool.get("com.wurmonline.server.questions.SpawnQuestion"); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " "+Arena.class.getName()+".respawnPlayer(this.getResponder(), com.wurmonline.server.Servers.localServer);" + " return;" + "}"; Util.insertBeforeDeclared(thisClass, ctSpawnQuestion, "sendQuestion", replace);*/ /*ctSpawnQuestion.getDeclaredMethod("sendQuestion").insertBefore("" + "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " mod.sin.wyvern.Arena.respawnPlayer(this.getResponder(), com.wurmonline.server.Servers.localServer);" + " return;" + "}");*/ // - Allow affinity stealing and battle rank changes - // Util.setReason("Allow affinity stealing and battle rank changes."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " $_ = true;" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctPlayer, "modifyRanking", "isEnemyOnChaos", replace); //CtClass ctCreature = classPool.get("com.wurmonline.server.creatures.Creature"); Util.setReason("Increase fight skill gain on PvP server."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " p.getFightingSkill().setKnowledge(pskill + (skillGained*1.5d), false);" + "}" + "$_ = $proceed($$);"; Util.instrumentDeclared(thisClass, ctCreature, "modifyFightSkill", "checkInitialTitle", replace); // - Fix nearby enemy check to find aggression instead of kingdom - // replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " $_ = c.getAttitude(performer) != 2 && c.getAttitude(performer) != 1;" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctMethodsItems, "isEnemiesNearby", "isFriendlyKingdom", replace); /*ctMethodsItems.getDeclaredMethod("isEnemiesNearby").instrument(new ExprEditor(){ public void edit(MethodCall m) throws CannotCompileException { if (m.getMethodName().equals("isFriendlyKingdom")) { m.replace("if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " $_ = c.getAttitude(performer) != 2;" + "}else{" + " $_ = $proceed($$);" + "}"); return; } } });*/ // - Ensure corpses are not loot protected on PvP - // Util.setReason("Ensure corpses are not loot protected."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " $_ = $proceed(false);" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctCreature, "die", "setProtected", replace); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " $_ = true;" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctCreature, "die", "isInPvPZone", replace); // - Allow players to do actions in PvP houses - // CtClass ctMethods = classPool.get("com.wurmonline.server.behaviours.Methods"); Util.setReason("Enable players to do actions in PvP houses."); replace = "$_ = com.wurmonline.server.Servers.localServer.PVPSERVER;"; Util.instrumentDeclared(thisClass, ctMethods, "isNotAllowedMessage", "isEnemy", replace); // - Allow stealing against deity wishes without being punished on Arena - // //CtClass ctAction = classPool.get("com.wurmonline.server.behaviours.Action"); Util.setReason("Allow stealing against deity wishes without being punished."); replace = "$_ = $proceed($$) || com.wurmonline.server.Servers.localServer.PVPSERVER;"; Util.instrumentDeclared(thisClass, ctAction, "checkLegalMode", "isLibila", replace); /*ctAction.getDeclaredMethod("checkLegalMode").instrument(new ExprEditor(){ public void edit(MethodCall m) throws CannotCompileException { if (m.getMethodName().equals("isLibila")) { m.replace("$_ = $proceed($$) || com.wurmonline.server.Servers.localServer.PVPSERVER;"); return; } } });*/ // - Allow taking ownership of vehicles on Arena - // // TODO: Fix. Util.setReason("Allow taking ownership of vehicles on Arena."); CtClass[] params3 = new CtClass[]{ CtClass.longType, CtClass.booleanType, CtClass.byteType, CtClass.intType, CtClass.intType }; String desc3 = Descriptor.ofMethod(CtClass.voidType, params3); replace = "$_ = com.wurmonline.server.Servers.localServer.PVPSERVER && !lVehicle.isLocked();"; Util.instrumentDescribed(thisClass, ctCreature, "setVehicle", desc3, "isThisAChaosServer", replace); // - Allow managing animals on Arena - // CtClass ctManageMenu = classPool.get("com.wurmonline.server.behaviours.ManageMenu"); replace = "$_ = false;"; Util.instrumentDeclared(thisClass, ctManageMenu, "getBehavioursFor", "isThisAPvpServer", replace); Util.instrumentDeclared(thisClass, ctManageMenu, "action", "isThisAPvpServer", replace); // - Multiply mine door bash damage by 3 on Arena - // CtClass ctTerraforming = classPool.get("com.wurmonline.server.behaviours.Terraforming"); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " damage *= 3d;" + "}" + "$_ = $proceed($$);"; Util.instrumentDeclared(thisClass, ctTerraforming, "destroyMineDoor", "getOrCreateTile", replace); /*ctTerraforming.getDeclaredMethod("destroyMineDoor").instrument(new ExprEditor(){ public void edit(MethodCall m) throws CannotCompileException { if (m.getMethodName().equals("getOrCreateTile")) { m.replace("if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " damage *= 3d;" + "}" + "$_ = $proceed($$);"); return; } } });*/ // - Prevent tons of errors for legality on Arena. - // replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " return true;" + "}"; Util.insertBeforeDeclared(thisClass, ctCreature, "isOkToKillBy", replace); /*ctCreature.getDeclaredMethod("isOkToKillBy").insertBefore("" + "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " return true;" + "}");*/ Util.insertBeforeDeclared(thisClass, ctCreature, "hasBeenAttackedBy", replace); /*ctCreature.getDeclaredMethod("hasBeenAttackedBy").insertBefore("" + "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " return true;" + "}");*/ // - Disable CA Help on Arena - // Util.setReason("Disable CA HELP on Arena."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " return false;" + "}"; Util.insertBeforeDeclared(thisClass, ctPlayer, "seesPlayerAssistantWindow", replace); Util.setReason("Make players who are non-allied enemies of villages."); CtClass ctVillage = classPool.get("com.wurmonline.server.villages.Village"); CtClass[] params4 = new CtClass[]{ ctCreature, CtClass.booleanType }; String desc4 = Descriptor.ofMethod(CtClass.booleanType, params4); replace = "" + "if(com.wurmonline.server.Servers.localServer.PVPSERVER && $1.isPlayer()){" + " if($1.getPower() > 0){" + " return false;" + " }" + " if(this.isCitizen($1) || this.isAlly($1)){" + " return false;" + " }" + " return true;" + "}" + // Additional code added to ensure village guards do not attack titans or rare creatures. "if("+Titans.class.getName()+".isTitan($1) || "+RareSpawns.class.getName()+".isRareCreature($1)){" + " return false;" + "}"; Util.insertBeforeDescribed(thisClass, ctVillage, "isEnemy", desc4, replace); Util.setReason("Make all deeds enemies of eachother unless allied."); CtClass[] params5 = new CtClass[]{ ctVillage }; String desc5 = Descriptor.ofMethod(CtClass.booleanType, params5); replace = "{ if($1 == null){" + " return false;" + " }" + " if($1.kingdom != this.kingdom){" + " return true;" + " }" + " if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " if(this.isAlly($1)){" + " return false;" + " }" + " if($0 == $1){" + " return false;" + " }" + " return true;" + "}" + "return false; }"; Util.setBodyDescribed(thisClass, ctVillage, "isEnemy", desc5, replace); Util.setReason("Change HotA reward"); replace = Arena.class.getName()+".createNewHotaPrize(this, $1);"; Util.setBodyDeclared(thisClass, ctVillage, "createHotaPrize", replace); CtClass ctGuardPlan = classPool.get("com.wurmonline.server.villages.GuardPlan"); CtClass[] params6 = new CtClass[]{ CtClass.intType, CtClass.intType }; String desc6 = Descriptor.ofMethod(CtClass.intType, params6); Util.setReason("Cap maximum guards to 5."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " return Math.min(5, Math.max(3, $1 * $2 / 49));" + "}"; Util.insertBeforeDescribed(thisClass, ctGuardPlan, "getMaxGuards", desc6, replace); Util.setReason("Disable towers"); CtClass ctAdvancedCreationEntry = classPool.get("com.wurmonline.server.items.AdvancedCreationEntry"); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " performer.getCommunicator().sendAlertServerMessage(\"Towers are disabled for now. A new system is in progress.\");" + " throw new com.wurmonline.server.NoSuchItemException(\"Towers are disabled.\");" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctAdvancedCreationEntry, "cont", "isTowerTooNear", replace); Util.instrumentDeclared(thisClass, ctAdvancedCreationEntry, "run", "isTowerTooNear", replace); Util.setReason("Reduce local range (player)."); replace = "if($3 > 5){" + " $_ = $proceed($1, $2, 50);" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctVirtualZone, "coversCreature", "isWithinDistanceTo", replace); Util.setReason("Reduce local range (creature)."); replace = "$_ = true;"; Util.instrumentDeclared(thisClass, ctVirtualZone, "coversCreature", "isPlayer", replace); CtClass ctKarmaQuestion = classPool.get("com.wurmonline.server.questions.KarmaQuestion"); Util.setReason("Disable Karma teleport."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " $_ = true;" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctKarmaQuestion, "answer", "isInPvPZone", replace); Util.setReason("Make players only able to lead one creature."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " return this.followers == null || this.followers.size() < 1;" + "}"; Util.insertBeforeDeclared(thisClass, ctPlayer, "mayLeadMoreCreatures", replace); CtClass ctMethodsStructure = classPool.get("com.wurmonline.server.behaviours.MethodsStructure"); Util.setReason("Increase bash timer to 15 seconds."); replace = "time = 600;" + "$_ = $proceed($$);"; Util.instrumentDeclared(thisClass, ctMethodsStructure, "destroyWall", "getStructure", replace); CtClass ctHota = classPool.get("com.wurmonline.server.epic.Hota"); Util.setReason("Display discord message for HotA announcements."); replace = Arena.class.getName()+".sendHotaMessage($1);" + "$_ = $proceed($$);"; Util.instrumentDeclared(thisClass, ctHota, "poll", "broadCastSafe", replace); Util.setReason("Display discord message for HotA wins."); Util.instrumentDeclared(thisClass, ctHota, "win", "broadCastSafe", replace); Util.setReason("Display discord message for HotA conquers & neutralizes."); replace = "if($2.getData1() == 0){" + " "+Arena.class.getName()+".sendHotaMessage($1.getName() + \" neutralizes the \" + $2.getName() + \".\");" + "}else{" + " "+Arena.class.getName()+".sendHotaMessage($1.getName() + \" conquers the \" + $2.getName() + \".\");" + "}"; Util.insertBeforeDeclared(thisClass, ctHota, "addPillarConquered", replace); // handle_TARGET_and_TARGET_HOSTILE CtClass ctCreatureBehaviour = classPool.get("com.wurmonline.server.behaviours.CreatureBehaviour"); Util.setReason("Allow players to attack enemy guards."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " $_ = false;" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctCreatureBehaviour, "handle_TARGET_and_TARGET_HOSTILE", "isFriendlyKingdom", replace); Util.setReason("Fix templars attacking themselves."); replace = "if($1.isSpiritGuard()){" + " return;" + "}"; Util.insertBeforeDeclared(thisClass, ctVillage, "addTarget", replace); Util.setReason("Keep mine doors open for shorter durations."); replace = "$_ = true;"; Util.instrumentDeclared(thisClass, ctCreature, "checkOpenMineDoor", "isThisAChaosServer", replace); Util.setReason("Fix fight skill gains against enemy players."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " if($0 == this){" + " $_ = -1;" + " }else{" + " $_ = $proceed($$);" + " }" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctCreature, "modifyFightSkill", "getKingdomId", replace); Util.setReason("Enable archering enemies on deeds."); replace = "$_ = true;"; Util.instrumentDeclared(thisClass, ctVillage, "mayAttack", "isEnemyOnChaos", replace); // Server.rand.nextFloat()*(35/(1-2*desiredPercent)) Util.setReason("Nerf magranon faith protection."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " $_ = com.wurmonline.server.Server.rand.nextInt(40);" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctCreature, "die", "getFavor", replace); /*Util.setReason("Nerf resurrection stones."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " $_ = com.wurmonline.server.Server.rand.nextInt(40) > 35;" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctCreature, "die", "isDeathProtected", replace);*/ Util.setReason("Adjust spawn question mechanics."); CtClass ctSpawnQuestion = classPool.get("com.wurmonline.server.questions.SpawnQuestion"); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + Arena.class.getName()+".sendNewSpawnQuestion(this);" + "return;" + "}"; Util.insertBeforeDeclared(thisClass, ctSpawnQuestion, "sendQuestion", replace); CtClass ctMeshIO = classPool.get("com.wurmonline.mesh.MeshIO"); CtClass[] params7 = new CtClass[]{ ctCreature, ctItem, CtClass.intType, CtClass.intType, CtClass.intType, CtClass.floatType, CtClass.booleanType, ctMeshIO, CtClass.booleanType }; String desc7 = Descriptor.ofMethod(CtClass.booleanType, params7); replace = Arena.class.getName()+".sendHotaMessage($1+\" \"+$2);" + "$_ = $proceed($$);"; Util.instrumentDescribed(thisClass, ctTerraforming, "dig", desc7, "addHistory", replace); // Creature performer, Item source, int tilex, int tiley, int tile, float counter, boolean corner, MeshIO mesh, boolean toPile Util.setReason("Set favored kingdom for PvP"); CtClass ctDeities = classPool.get("com.wurmonline.server.deities.Deities"); replace = "{ return (byte) 4; }"; Util.setBodyDeclared(thisClass, ctDeities, "getFavoredKingdom", replace); Util.setReason("Set favored kingdom for PvP"); CtClass ctDeity = classPool.get("com.wurmonline.server.deities.Deity"); replace = "{ return (byte) 4; }"; Util.setBodyDeclared(thisClass, ctDeities, "getFavoredKingdom", replace); /*Util.setReason("Decrease PvP combat damage."); CtClass ctString = classPool.get("java.lang.String"); CtClass ctBattle = classPool.get("com.wurmonline.server.combat.Battle"); CtClass ctCombatEngine = classPool.get("com.wurmonline.server.combat.CombatEngine"); // @Nullable Creature performer, Creature defender, byte type, int pos, double damage, float armourMod, // String attString, @Nullable Battle battle, float infection, float poison, boolean archery, boolean alreadyCalculatedResist CtClass[] params8 = { ctCreature, ctCreature, CtClass.byteType, CtClass.intType, CtClass.doubleType, CtClass.floatType, ctString, ctBattle, CtClass.floatType, CtClass.floatType, CtClass.booleanType, CtClass.booleanType }; String desc8 = Descriptor.ofMethod(CtClass.booleanType, params8); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER && ($2.isDominated() || $2.isPlayer()) && $1 != null && $1.isPlayer()){" + " logger.info(\"Detected player hit against player/pet opponent. Halving damage.\");" + " $5 = $5 * 0.5d;" + "}"; Util.insertBeforeDescribed(thisClass, ctCombatEngine, "addWound", desc8, replace);*/ Util.setReason("Reduce player vs player damage by half."); CtClass ctCombatHandler = classPool.get("com.wurmonline.server.creatures.CombatHandler"); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER && ($1.isDominated() || $1.isPlayer()) && $0.creature.isPlayer()){" + //" logger.info(\"Detected player hit against player/pet opponent. Halving damage.\");" + " $3 = $3 * 0.7d;" + "}"; Util.insertBeforeDeclared(thisClass, ctCombatHandler, "setDamage", replace); Util.setReason("Disable crown influence from spreading to enemies."); replace = "$_ = $0.getAttitude(this) == 1;"; Util.instrumentDeclared(thisClass, ctPlayer, "spreadCrownInfluence", "isFriendlyKingdom", replace); Util.setReason("Disable item drops from players on Arena."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER && this.isPlayer()){" + " this.getCommunicator().sendSafeServerMessage(\"You have died on the Arena server and your items are kept safe.\");" + " keepItems = true;" + "}" + "$_ = $proceed($$);"; Util.instrumentDeclaredCount(thisClass, ctCreature, "die", "isOnCurrentServer", 1, replace); Util.setReason("Disable player skill loss on Arena."); replace = "if(this.isPlayer() && this.isDeathProtected()){" + " this.getCommunicator().sendSafeServerMessage(\"You have died with a Resurrection Stone and your knowledge is kept safe.\");" + " return;" + "}else{" + " this.getCommunicator().sendAlertServerMessage(\"You have died without a Resurrection Stone, resulting in some of your knowledge being lost.\");" + "}"; Util.insertBeforeDeclared(thisClass, ctCreature, "punishSkills", replace); Util.setReason("Disable player fight skill loss on Arena."); replace = "if(this.isPlayer() && this.isDeathProtected()){" + " $_ = null;" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclaredCount(thisClass, ctCreature, "modifyFightSkill", "setKnowledge", 1, replace); Util.setReason("Disable player affinity loss on Arena."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER && this.isPlayer() && this.isDeathProtected()){" + " this.getCommunicator().sendSafeServerMessage(\"Your resurrection stone keeps your affinities safe from your slayers.\");" + " $_ = "+Arena.class.getName()+".getNullAffinities();" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctPlayer, "modifyRanking", "getAffinities", replace); /*Util.setReason("Enable stealing from deeds."); replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + " $_ = true;" + "}else{" + " $_ = $proceed($$);" + "}"; Util.instrumentDeclared(thisClass, ctMethodsItems, "checkIfStealing", "mayPass", replace);*/ }catch (NotFoundException e) { throw new HookException(e); } } }