From b8a396a06ec9f1b622d9605caefbe59a093812e3 Mon Sep 17 00:00:00 2001 From: Noe Caratini <caratinin@gmail.com> Date: Sun, 12 Jun 2022 01:20:14 +0100 Subject: [PATCH] fix(crystalcaverns): Fixed Crystalline Golems going after fragments that don't exist in current instance Small cleanup of some other parts of the code --- .../CrystalCaverns/CrystalCaverns.java | 174 +++++++----------- 1 file changed, 62 insertions(+), 112 deletions(-) diff --git a/src/main/java/com/l2jserver/datapack/instances/CrystalCaverns/CrystalCaverns.java b/src/main/java/com/l2jserver/datapack/instances/CrystalCaverns/CrystalCaverns.java index 7773054a9d..465b5513dd 100644 --- a/src/main/java/com/l2jserver/datapack/instances/CrystalCaverns/CrystalCaverns.java +++ b/src/main/java/com/l2jserver/datapack/instances/CrystalCaverns/CrystalCaverns.java @@ -18,14 +18,6 @@ */ package com.l2jserver.datapack.instances.CrystalCaverns; -import static com.l2jserver.gameserver.config.Configuration.rates; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - import com.l2jserver.datapack.instances.AbstractInstance; import com.l2jserver.datapack.quests.Q00131_BirdInACage.Q00131_BirdInACage; import com.l2jserver.gameserver.GeoData; @@ -63,6 +55,18 @@ import com.l2jserver.gameserver.network.serverpackets.SpecialCamera; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; import com.l2jserver.gameserver.network.serverpackets.ValidateLocation; import com.l2jserver.gameserver.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +import static com.l2jserver.gameserver.config.Configuration.rates; /** * Crystal Caverns instance zone.<br> @@ -73,6 +77,8 @@ import com.l2jserver.gameserver.util.Util; * Original sources: theone, L2JEmu, L2JOfficial, L2JFree Contributing authors: TGS, Lantoc, Janiii, Gigiikun, RosT Please maintain consistency between the Crystal Caverns scripts. */ public final class CrystalCaverns extends AbstractInstance { + private static final Logger LOG = LoggerFactory.getLogger(CrystalCaverns.class); + protected static class CrystalGolem { protected L2ItemInstance foodItem = null; protected boolean isAtDestination = false; @@ -664,15 +670,11 @@ public final class CrystalCaverns extends AbstractInstance { @Override public void onEnterInstance(L2PcInstance player, InstanceWorld world, boolean firstEntrance) { if (firstEntrance) { - if (player.getParty() == null) { - teleportPlayer(player, START_LOC, world.getInstanceId()); - world.addAllowed(player.getObjectId()); - } else { - for (L2PcInstance partyMember : player.getParty().getMembers()) { - teleportPlayer(partyMember, START_LOC, world.getInstanceId()); - world.addAllowed(partyMember.getObjectId()); - } - } + Optional.ofNullable(player.getParty()).map(L2Party::getMembers).orElseGet(() -> List.of(player)) + .forEach(member -> { + teleportPlayer(member, START_LOC, world.getInstanceId()); + world.addAllowed(member.getObjectId()); + }); runOracle((CCWorld) world); } else { teleportPlayer(player, START_LOC, world.getInstanceId()); @@ -886,9 +888,7 @@ public final class CrystalCaverns extends AbstractInstance { return super.onSkillSee(npc, caster, skill, targets, isSummon); } InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId()); - if (tmpworld instanceof CCWorld) { - CCWorld world = (CCWorld) tmpworld; - + if (tmpworld instanceof CCWorld world) { if (((world._dragonClawStart + DRAGONCLAWTIME) <= System.currentTimeMillis()) || (world._dragonClawNeed <= 0)) { world._dragonClawStart = System.currentTimeMillis(); world._dragonClawNeed = caster.getParty().getMemberCount() - 1; @@ -905,8 +905,7 @@ public final class CrystalCaverns extends AbstractInstance { } } else if (npc.isInvul() && (npc.getId() == TEARS) && (skill.getId() == 2369) && (caster != null)) { InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId()); - if (tmpworld instanceof CCWorld) { - CCWorld world = (CCWorld) tmpworld; + if (tmpworld instanceof CCWorld world) { if (caster.getParty() == null) { return super.onSkillSee(npc, caster, skill, targets, isSummon); } else if (((world.dragonScaleStart + DRAGONSCALETIME) <= System.currentTimeMillis()) || (world.dragonScaleNeed <= 0)) { @@ -1157,28 +1156,20 @@ public final class CrystalCaverns extends AbstractInstance { return ""; } - CrystalGolem cryGolem = world.crystalGolems.get(npc); - int minDist = 300000; - for (L2Object object : L2World.getInstance().getVisibleObjects(npc, 300)) { - if (object.isItem() && (object.getId() == CRYSTAL_FRAGMENT)) { - int dx = npc.getX() - object.getX(); - int dy = npc.getY() - object.getY(); - int d = (dx * dx) + (dy * dy); - if (d < minDist) { - minDist = d; - cryGolem.foodItem = (L2ItemInstance) object; - } - } - } - - if (minDist != 300000) { - startQuestTimer("getFood", 2000, npc, null); - } else { - if (getRandom(100) < 5) { - npc.broadcastPacket(new CreatureSay(npc.getObjectId(), 1, npc.getName(), NpcStringId.AH_IM_HUNGRY)); - } - startQuestTimer("autoFood", 2000, npc, null); - } + L2World.getInstance().getVisibleObjects(npc, 300).stream() + .filter(obj -> obj.getInstanceId() == world.getInstanceId() && obj.isItem() && obj.getId() == CRYSTAL_FRAGMENT) + .min(Comparator.comparing(obj -> Util.calculateDistance(npc, obj, false, false))) + .ifPresentOrElse( + obj -> { + world.crystalGolems.get(npc).foodItem = (L2ItemInstance) obj; + startQuestTimer("getFood", 2000, npc, null); + }, + () -> { + if (getRandom(100) < 5) { + npc.broadcastPacket(new CreatureSay(npc.getObjectId(), 1, npc.getName(), NpcStringId.AH_IM_HUNGRY)); + } + startQuestTimer("autoFood", 2000, npc, null); + }); return ""; } else if (!world.crystalGolems.containsKey(npc) || world.crystalGolems.get(npc).isAtDestination) { return ""; @@ -1236,42 +1227,26 @@ public final class CrystalCaverns extends AbstractInstance { } private void giveRewards(L2PcInstance player, int instanceId, int bossCry, boolean isBaylor) { - final int num = Math.max(rates().getCorpseDropChanceMultiplier().intValue(), 1); - - L2Party party = player.getParty(); - if (party != null) { - for (L2PcInstance partyMember : party.getMembers()) { - if (partyMember.getInstanceId() == instanceId) { - if (!isBaylor && hasQuestItems(partyMember, CONTAMINATED_CRYSTAL)) { - takeItems(partyMember, CONTAMINATED_CRYSTAL, 1); - giveItems(partyMember, bossCry, 1); + final int dropAmount = Math.max(rates().getDeathDropAmountMultiplier().intValue(), 1); + Optional.ofNullable(player.getParty()).map(L2Party::getMembers).orElseGet(() -> List.of(player)).stream() + .filter(member -> member.getInstanceId() == instanceId) + .forEach(member -> { + if (!isBaylor && hasQuestItems(member, CONTAMINATED_CRYSTAL)) { + takeItems(member, CONTAMINATED_CRYSTAL, 1); + giveItems(member, bossCry, 1); } if (getRandom(10) < 5) { - giveItems(partyMember, WHITE_SEED_OF_EVIL_SHARD, num); + giveItems(member, WHITE_SEED_OF_EVIL_SHARD, dropAmount); } else { - giveItems(partyMember, BLACK_SEED_OF_EVIL_SHARD, num); + giveItems(member, BLACK_SEED_OF_EVIL_SHARD, dropAmount); } - } - } - } else if (player.getInstanceId() == instanceId) { - if (!isBaylor && hasQuestItems(player, CONTAMINATED_CRYSTAL)) { - takeItems(player, CONTAMINATED_CRYSTAL, 1); - giveItems(player, bossCry, 1); - } - if (getRandom(10) < 5) { - giveItems(player, WHITE_SEED_OF_EVIL_SHARD, num); - } else { - giveItems(player, BLACK_SEED_OF_EVIL_SHARD, num); - } - } - + }); } @Override public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon) { InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId()); - if (tmpworld instanceof CCWorld) { - CCWorld world = (CCWorld) tmpworld; + if (tmpworld instanceof CCWorld world) { if ((world.getStatus() == 2) && world.npcList1.containsKey(npc)) { world.npcList1.put(npc, true); for (boolean isDead : world.npcList1.values()) { @@ -1299,18 +1274,12 @@ public final class CrystalCaverns extends AbstractInstance { } else if (npc.getId() == GATEKEEPER_PROVO) { npc.dropItem(player, 9699, 1); runSteamRooms(world, STEAM1_SPAWNS, 22); - L2Party party = player.getParty(); - if (party != null) { - for (L2PcInstance partyMember : party.getMembers()) { - if (partyMember.getInstanceId() == world.getInstanceId()) { - EVENT_TIMER_1.getSkill().applyEffects(partyMember, partyMember); - startQuestTimer("Timer2", 300000, npc, partyMember); - } - } - } else { - EVENT_TIMER_1.getSkill().applyEffects(player, player); - startQuestTimer("Timer2", 300000, npc, player); - } + Optional.ofNullable(player.getParty()).map(L2Party::getMembers).orElseGet(() -> List.of(player)).stream() + .filter(member -> member.getInstanceId() == world.getInstanceId()) + .forEach(member -> { + EVENT_TIMER_1.getSkill().applyEffects(member, member); + startQuestTimer("Timer2", 300000, npc, member); + }); startQuestTimer("Timer21", 300000, npc, null); } for (L2Npc gk : world.keyKeepers) { @@ -1383,12 +1352,8 @@ public final class CrystalCaverns extends AbstractInstance { break; case 25: world.setStatus(26); - L2Party party = player.getParty(); - if (party != null) { - for (L2PcInstance partyMember : party.getMembers()) { - partyMember.stopSkillEffects(true, 5239); - } - } + Optional.ofNullable(player.getParty()).map(L2Party::getMembers).orElseGet(() -> List.of(player)) + .forEach(member -> member.stopSkillEffects(true, 5239)); cancelQuestTimers("Timer5"); cancelQuestTimers("Timer51"); openDoor(DOOR3, npc.getInstanceId()); @@ -1466,19 +1431,13 @@ public final class CrystalCaverns extends AbstractInstance { loc = new Location(147529, 152587, -12169); cancelQuestTimers("Timer2"); cancelQuestTimers("Timer21"); - if (party != null) { - for (L2PcInstance partyMember : party.getMembers()) { - if (partyMember.getInstanceId() == world.getInstanceId()) { - partyMember.stopSkillEffects(true, 5239); - EVENT_TIMER_2.getSkill().applyEffects(partyMember, partyMember); - startQuestTimer("Timer3", 600000, npc, partyMember); - } - } - } else { - player.stopSkillEffects(true, 5239); - EVENT_TIMER_2.getSkill().applyEffects(player, player); - startQuestTimer("Timer3", 600000, npc, player); - } + Optional.ofNullable(player.getParty()).map(L2Party::getMembers).orElseGet(() -> List.of(player)).stream() + .filter(member -> member.getInstanceId() == world.getInstanceId()) + .forEach(member -> { + member.stopSkillEffects(true, 5239); + EVENT_TIMER_2.getSkill().applyEffects(member, member); + startQuestTimer("Timer3", 600000, npc, member); + }); startQuestTimer("Timer31", 600000, npc, null); break; case 32276: @@ -1544,16 +1503,7 @@ public final class CrystalCaverns extends AbstractInstance { } else if (npc.getId() == ORACLE_GUIDE_3) { if ((world.getStatus() < 30) && checkBaylorConditions(player)) { world._raiders.clear(); - L2Party party = player.getParty(); - if (party == null) { - world._raiders.add(player); - } else { - for (L2PcInstance partyMember : party.getMembers()) { - // int rnd = getRandom(100); - // partyMember.destroyItemByItemId("Quest", (rnd < 33 ? BOSS_CRYSTAL_1:(rnd < 67 ? BOSS_CRYSTAL_2:BOSS_CRYSTAL_3)), 1, partyMember, true); Crystals are no longer beign cunsumed while entering to Baylor Lair. - world._raiders.add(partyMember); - } - } + world._raiders.addAll(Optional.ofNullable(player.getParty()).map(L2Party::getMembers).orElseGet(() -> List.of(player))); } else { return ""; } -- GitLab