Sync with L2jServer HighFive Jul 3rd 2015.

This commit is contained in:
MobiusDev
2015-07-03 21:10:51 +00:00
parent 9c11f00722
commit ac006cde6a
29 changed files with 311 additions and 268 deletions

View File

@@ -100,7 +100,6 @@ public final class Baium extends AbstractNpcAI
// Misc // Misc
private L2GrandBossInstance _baium = null; private L2GrandBossInstance _baium = null;
private static long _lastAttack = 0; private static long _lastAttack = 0;
private static L2PcInstance _standbyPlayer = null;
private Baium() private Baium()
{ {
@@ -213,6 +212,7 @@ public final class Baium extends AbstractNpcAI
_lastAttack = System.currentTimeMillis(); _lastAttack = System.currentTimeMillis();
startQuestTimer("WAKEUP_ACTION", 50, _baium, null); startQuestTimer("WAKEUP_ACTION", 50, _baium, null);
startQuestTimer("MANAGE_EARTHQUAKE", 2000, _baium, null); startQuestTimer("MANAGE_EARTHQUAKE", 2000, _baium, null);
startQuestTimer("SOCIAL_ACTION", 10000, _baium, player);
startQuestTimer("CHECK_ATTACK", 60000, _baium, null); startQuestTimer("CHECK_ATTACK", 60000, _baium, null);
} }
break; break;
@@ -231,7 +231,6 @@ public final class Baium extends AbstractNpcAI
{ {
zone.broadcastPacket(new Earthquake(npc.getX(), npc.getY(), npc.getZ(), 40, 10)); zone.broadcastPacket(new Earthquake(npc.getX(), npc.getY(), npc.getZ(), 40, 10));
zone.broadcastPacket(new PlaySound("BS02_A")); zone.broadcastPacket(new PlaySound("BS02_A"));
startQuestTimer("SOCIAL_ACTION", 8000, npc, player);
} }
break; break;
} }
@@ -253,10 +252,18 @@ public final class Baium extends AbstractNpcAI
player.teleToLocation(BAIUM_GIFT_LOC); player.teleToLocation(BAIUM_GIFT_LOC);
startQuestTimer("PLAYER_KILL", 3000, npc, player); startQuestTimer("PLAYER_KILL", 3000, npc, player);
} }
else if ((_standbyPlayer != null) && _standbyPlayer.isInsideRadius(npc, 16000, true, false)) else
{ {
_standbyPlayer.teleToLocation(BAIUM_GIFT_LOC); L2PcInstance randomPlayer = getRandomPlayer(npc);
startQuestTimer("PLAYER_KILL", 3000, npc, _standbyPlayer); if (randomPlayer != null)
{
randomPlayer.teleToLocation(BAIUM_GIFT_LOC);
startQuestTimer("PLAYER_KILL", 3000, npc, randomPlayer);
}
else
{
startQuestTimer("PLAYER_KILL", 3000, npc, null);
}
} }
} }
break; break;
@@ -266,20 +273,20 @@ public final class Baium extends AbstractNpcAI
if ((player != null) && player.isInsideRadius(npc, 16000, true, false)) if ((player != null) && player.isInsideRadius(npc, 16000, true, false))
{ {
zone.broadcastPacket(new SocialAction(npc.getObjectId(), 1)); zone.broadcastPacket(new SocialAction(npc.getObjectId(), 1));
broadcastNpcSay(npc, ChatType.NPC_GENERAL, player.getName() + ", How dare you wake me! Now you shall die!"); // TODO: replace with NpcStringId when are done core support broadcastNpcSay(npc, ChatType.NPC_GENERAL, NpcStringId.HOW_DARE_YOU_WAKE_ME_NOW_YOU_SHALL_DIE, player.getName());
npc.setTarget(player); npc.setTarget(player);
npc.doCast(BAIUM_PRESENT.getSkill()); npc.doCast(BAIUM_PRESENT.getSkill());
} }
for (L2PcInstance players : zone.getPlayersInside()) for (L2PcInstance insidePlayer : zone.getPlayersInside())
{ {
if (players.isHero()) if (insidePlayer.isHero())
{ {
zone.broadcastPacket(new ExShowScreenMessage(NpcStringId.NOT_EVEN_THE_GODS_THEMSELVES_COULD_TOUCH_ME_BUT_YOU_S1_YOU_DARE_CHALLENGE_ME_IGNORANT_MORTAL, 2, 4000, players.getName())); zone.broadcastPacket(new ExShowScreenMessage(NpcStringId.NOT_EVEN_THE_GODS_THEMSELVES_COULD_TOUCH_ME_BUT_YOU_S1_YOU_DARE_CHALLENGE_ME_IGNORANT_MORTAL, 2, 4000, insidePlayer.getName()));
break; break;
} }
} }
startQuestTimer("SPAWN_ARCHANGEL", 8000, npc, null); startQuestTimer("SPAWN_ARCHANGEL", 8000, npc, player);
break; break;
} }
case "SPAWN_ARCHANGEL": case "SPAWN_ARCHANGEL":
@@ -296,19 +303,12 @@ public final class Baium extends AbstractNpcAI
{ {
addAttackPlayerDesire(npc, player); addAttackPlayerDesire(npc, player);
} }
else if ((_standbyPlayer != null) && !_standbyPlayer.isDead())
{
addAttackPlayerDesire(npc, _standbyPlayer);
}
else else
{ {
for (L2Character creature : npc.getKnownList().getKnownCharactersInRadius(2000)) L2PcInstance randomPlayer = getRandomPlayer(npc);
if (randomPlayer != null)
{ {
if ((creature != null) && creature.isPlayer() && zone.isInsideZone(creature) && !creature.isDead()) addAttackPlayerDesire(npc, randomPlayer);
{
addAttackPlayerDesire(npc, (L2Playable) creature);
break;
}
} }
} }
break; break;
@@ -377,6 +377,7 @@ public final class Baium extends AbstractNpcAI
{ {
if ((npc != null) && ((_lastAttack + 1800000) < System.currentTimeMillis())) if ((npc != null) && ((_lastAttack + 1800000) < System.currentTimeMillis()))
{ {
cancelQuestTimers("SELECT_TARGET");
notifyEvent("CLEAR_ZONE", null, null); notifyEvent("CLEAR_ZONE", null, null);
addSpawn(BAIUM_STONE, BAIUM_LOC, false, 0); addSpawn(BAIUM_STONE, BAIUM_LOC, false, 0);
setStatus(ALIVE); setStatus(ALIVE);
@@ -560,6 +561,7 @@ public final class Baium extends AbstractNpcAI
startQuestTimer("CLEAR_STATUS", respawnTime, null, null); startQuestTimer("CLEAR_STATUS", respawnTime, null, null);
startQuestTimer("CLEAR_ZONE", 900000, null, null); startQuestTimer("CLEAR_ZONE", 900000, null, null);
cancelQuestTimer("CHECK_ATTACK", npc, null); cancelQuestTimer("CHECK_ATTACK", npc, null);
cancelQuestTimers("SELECT_TARGET");
} }
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
@@ -572,11 +574,6 @@ public final class Baium extends AbstractNpcAI
return super.onSeeCreature(npc, creature, isSummon); return super.onSeeCreature(npc, creature, isSummon);
} }
if (creature.isPlayer() && !creature.isDead() && (_standbyPlayer == null))
{
_standbyPlayer = (L2PcInstance) creature;
}
if (creature.isInCategory(CategoryType.CLERIC_GROUP)) if (creature.isInCategory(CategoryType.CLERIC_GROUP))
{ {
if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25)) if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
@@ -785,6 +782,18 @@ public final class Baium extends AbstractNpcAI
} }
} }
private L2PcInstance getRandomPlayer(L2Npc npc)
{
for (L2Character creature : npc.getKnownList().getKnownCharactersInRadius(2000))
{
if ((creature != null) && creature.isPlayer() && zone.isInsideZone(creature) && !creature.isDead())
{
return (L2PcInstance) creature;
}
}
return null;
}
public static void main(String[] args) public static void main(String[] args)
{ {
new Baium(); new Baium();

View File

@@ -3,5 +3,5 @@ I'm very impressed.<br>
No one has ever broken through this fast to the Hall of Suffering. Extraordinary! In recognition of your achievement, I will give you a <font color="LEVEL">Jeweled Battle Supply</font>.<br> No one has ever broken through this fast to the Hall of Suffering. Extraordinary! In recognition of your achievement, I will give you a <font color="LEVEL">Jeweled Battle Supply</font>.<br>
It is granted only to those who achieve an especially impressive feat in battle.<br> It is granted only to those who achieve an especially impressive feat in battle.<br>
Your leader may receive it on your behalf.<br> Your leader may receive it on your behalf.<br>
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a> <a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
</body></html> </body></html>

View File

@@ -2,5 +2,5 @@
Unknown Text!<br> Unknown Text!<br>
The reward is <font color="LEVEL">Mother-of-Pearl Ornamented Duel Supplies</font>.<br> The reward is <font color="LEVEL">Mother-of-Pearl Ornamented Duel Supplies</font>.<br>
I'll grant this reward to the leader who represents all of you.<br> I'll grant this reward to the leader who represents all of you.<br>
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a> <a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
</body></html> </body></html>

View File

@@ -2,5 +2,5 @@
Unknown Text!<br> Unknown Text!<br>
The reward is <font color="LEVEL">Gold-Ornamented Duel Supplies</font>.<br> The reward is <font color="LEVEL">Gold-Ornamented Duel Supplies</font>.<br>
I'll grant this reward to the leader who represents all of you.<br> I'll grant this reward to the leader who represents all of you.<br>
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a> <a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
</body></html> </body></html>

View File

@@ -2,5 +2,5 @@
Unknown Text!<br> Unknown Text!<br>
The reward is <font color="LEVEL">Silver-Ornamented Duel Supplies</font>.<br> The reward is <font color="LEVEL">Silver-Ornamented Duel Supplies</font>.<br>
I'll grant this reward to the leader who represents all of you.<br> I'll grant this reward to the leader who represents all of you.<br>
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a> <a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
</body></html> </body></html>

View File

@@ -2,5 +2,5 @@
Unknown Text!<br> Unknown Text!<br>
The reward is <font color="LEVEL">Bronze-Ornamented Duel Supplies</font>.<br> The reward is <font color="LEVEL">Bronze-Ornamented Duel Supplies</font>.<br>
I'll grant this reward to the leader who represents all of you.<br> I'll grant this reward to the leader who represents all of you.<br>
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a> <a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
</body></html> </body></html>

View File

@@ -2,5 +2,5 @@
Unknown Text!<br> Unknown Text!<br>
The reward is <font color="LEVEL">Non-Ornamented Duel Supplies</font>.<br> The reward is <font color="LEVEL">Non-Ornamented Duel Supplies</font>.<br>
I'll grant this reward to the leader who represents all of you.<br> I'll grant this reward to the leader who represents all of you.<br>
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a> <a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
</body></html> </body></html>

View File

@@ -2,5 +2,5 @@
Unknown Text!<br> Unknown Text!<br>
The reward is <font color="LEVEL">Weak-Looking Duel Supplies</font>.<br> The reward is <font color="LEVEL">Weak-Looking Duel Supplies</font>.<br>
I'll grant this reward to the leader who represents all of you.<br> I'll grant this reward to the leader who represents all of you.<br>
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a> <a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
</body></html> </body></html>

View File

@@ -2,5 +2,5 @@
Unknown Text!<br> Unknown Text!<br>
The reward is <font color="LEVEL">Sad-Looking Duel Supplies</font>.<br> The reward is <font color="LEVEL">Sad-Looking Duel Supplies</font>.<br>
I'll grant this reward to the leader who represents all of you.<br> I'll grant this reward to the leader who represents all of you.<br>
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a> <a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
</body></html> </body></html>

View File

@@ -2,5 +2,5 @@
Unknown Text!<br> Unknown Text!<br>
The reward is <font color="LEVEL">Poor-Looking Duel Supplies</font>.<br> The reward is <font color="LEVEL">Poor-Looking Duel Supplies</font>.<br>
I'll grant this reward to the leader who represents all of you.<br> I'll grant this reward to the leader who represents all of you.<br>
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a> <a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
</body></html> </body></html>

View File

@@ -2,5 +2,5 @@
I'm very disappointed.<br> I'm very disappointed.<br>
If I had known your skills were this embarrasingly poor, I would not have assigned you this mission. You're lucky to still be alive! Still, a promise is a promise, so I will give you this <font color="LEVEL">Worthless Battle Supply</font>.<br> If I had known your skills were this embarrasingly poor, I would not have assigned you this mission. You're lucky to still be alive! Still, a promise is a promise, so I will give you this <font color="LEVEL">Worthless Battle Supply</font>.<br>
I'll grant this reward to the leader who represents all of you.<br> I'll grant this reward to the leader who represents all of you.<br>
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a> <a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
</body></html> </body></html>

View File

@@ -188,7 +188,7 @@ public final class HallOfSuffering extends AbstractNpcAI
public HallOfSuffering() public HallOfSuffering()
{ {
super(HallOfSuffering.class.getSimpleName(), "gracia/instances/SeedOfInfinity/HallOfSuffering"); super(HallOfSuffering.class.getSimpleName(), "gracia/instances/SeedOfInfinity");
addStartNpc(MOUTHOFEKIMUS, TEPIOS); addStartNpc(MOUTHOFEKIMUS, TEPIOS);
addTalkId(MOUTHOFEKIMUS, TEPIOS); addTalkId(MOUTHOFEKIMUS, TEPIOS);
addFirstTalkId(TEPIOS); addFirstTalkId(TEPIOS);
@@ -449,7 +449,7 @@ public final class HallOfSuffering extends AbstractNpcAI
private String getPtLeaderText(L2PcInstance player, HSWorld world) private String getPtLeaderText(L2PcInstance player, HSWorld world)
{ {
String htmltext = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), "/scripts/instances/SeedOfInfinity/HallOfSuffering/32530-10.htm"); String htmltext = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), "/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-10.htm");
htmltext = htmltext.replaceAll("%ptLeader%", String.valueOf(world.ptLeaderName)); htmltext = htmltext.replaceAll("%ptLeader%", String.valueOf(world.ptLeaderName));
return htmltext; return htmltext;
} }

View File

@@ -1355,11 +1355,13 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
setAttackTarget(caster.getMostHated()); setAttackTarget(caster.getMostHated());
} }
} }
L2Character attackTarget = getAttackTarget();
final L2Character attackTarget = getAttackTarget();
if (attackTarget == null) if (attackTarget == null)
{ {
return false; return false;
} }
double dist = caster.calculateDistance(attackTarget, false, false); double dist = caster.calculateDistance(attackTarget, false, false);
double dist2 = dist - attackTarget.getTemplate().getCollisionRadius(); double dist2 = dist - attackTarget.getTemplate().getCollisionRadius();
double range = caster.getPhysicalAttackRange() + caster.getTemplate().getCollisionRadius() + attackTarget.getTemplate().getCollisionRadius(); double range = caster.getPhysicalAttackRange() + caster.getTemplate().getCollisionRadius() + attackTarget.getTemplate().getCollisionRadius();
@@ -1376,10 +1378,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
if (!caster.isAffectedBySkill(sk.getId())) if (!caster.isAffectedBySkill(sk.getId()))
{ {
clientStopMoving(null); clientStopMoving(null);
// L2Object target = attackTarget;
caster.setTarget(caster); caster.setTarget(caster);
caster.doCast(sk); caster.doCast(sk);
// _actor.setTarget(target); _actor.setTarget(attackTarget);
return true; return true;
} }
// ---------------------------------------- // ----------------------------------------
@@ -1394,20 +1395,18 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
if (target != null) if (target != null)
{ {
clientStopMoving(null); clientStopMoving(null);
L2Object targets = attackTarget;
caster.setTarget(target); caster.setTarget(target);
caster.doCast(sk); caster.doCast(sk);
caster.setTarget(targets); caster.setTarget(attackTarget);
return true; return true;
} }
} }
if (canParty(sk)) if (canParty(sk))
{ {
clientStopMoving(null); clientStopMoving(null);
L2Object targets = attackTarget;
caster.setTarget(caster); caster.setTarget(caster);
caster.doCast(sk); caster.doCast(sk);
caster.setTarget(targets); caster.setTarget(attackTarget);
return true; return true;
} }
} }
@@ -1464,10 +1463,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
if (target != null) if (target != null)
{ {
clientStopMoving(null); clientStopMoving(null);
L2Object targets = attackTarget;
caster.setTarget(target); caster.setTarget(target);
caster.doCast(sk); caster.doCast(sk);
caster.setTarget(targets); caster.setTarget(attackTarget);
return true; return true;
} }
} }
@@ -1506,15 +1504,18 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
clientStopMoving(null); clientStopMoving(null);
caster.setTarget(leader); caster.setTarget(leader);
caster.doCast(sk); caster.doCast(sk);
caster.setTarget(attackTarget);
return true; return true;
} }
} }
} }
if (Rnd.get(100) < ((100 - percentage) / 3)) if (Rnd.get(100) < ((100 - percentage) / 3))
{ {
clientStopMoving(null); clientStopMoving(null);
caster.setTarget(caster); caster.setTarget(caster);
caster.doCast(sk); caster.doCast(sk);
caster.setTarget(attackTarget);
return true; return true;
} }
@@ -1541,6 +1542,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
clientStopMoving(null); clientStopMoving(null);
caster.setTarget(obj); caster.setTarget(obj);
caster.doCast(sk); caster.doCast(sk);
caster.setTarget(attackTarget);
return true; return true;
} }
} }
@@ -1554,6 +1556,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
{ {
continue; continue;
} }
L2Npc targets = ((L2Npc) obj); L2Npc targets = ((L2Npc) obj);
if (targets.isInMyClan(caster)) if (targets.isInMyClan(caster))
{ {
@@ -1562,6 +1565,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
clientStopMoving(null); clientStopMoving(null);
caster.setTarget(caster); caster.setTarget(caster);
caster.doCast(sk); caster.doCast(sk);
caster.setTarget(attackTarget);
return true; return true;
} }
} }
@@ -1584,10 +1588,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
if (target != null) if (target != null)
{ {
clientStopMoving(null); clientStopMoving(null);
L2Object targets = attackTarget;
caster.setTarget(target); caster.setTarget(target);
caster.doCast(sk); caster.doCast(sk);
caster.setTarget(targets); caster.setTarget(attackTarget);
return true; return true;
} }
} }
@@ -1738,6 +1741,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
clientStopMoving(null); clientStopMoving(null);
caster.setTarget(leader); caster.setTarget(leader);
caster.doCast(sk); caster.doCast(sk);
caster.setTarget(attackTarget);
return true; return true;
} }
} }
@@ -1755,6 +1759,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
{ {
continue; continue;
} }
if (Rnd.get(100) < 10) if (Rnd.get(100) < 10)
{ {
if (GeoData.getInstance().canSeeTarget(caster, targets)) if (GeoData.getInstance().canSeeTarget(caster, targets))
@@ -1762,6 +1767,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
clientStopMoving(null); clientStopMoving(null);
caster.setTarget(obj); caster.setTarget(obj);
caster.doCast(sk); caster.doCast(sk);
caster.setTarget(attackTarget);
return true; return true;
} }
} }
@@ -1783,6 +1789,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
clientStopMoving(null); clientStopMoving(null);
caster.setTarget(caster); caster.setTarget(caster);
caster.doCast(sk); caster.doCast(sk);
caster.setTarget(attackTarget);
return true; return true;
} }
} }
@@ -1804,10 +1811,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
if (target != null) if (target != null)
{ {
clientStopMoving(null); clientStopMoving(null);
L2Object targets = attackTarget;
caster.setTarget(target); caster.setTarget(target);
caster.doCast(sk); caster.doCast(sk);
caster.setTarget(targets); caster.setTarget(attackTarget);
return true; return true;
} }
} }

View File

@@ -112,7 +112,9 @@ public final class AnnouncementsTable
{ {
if (announce.isValid() && (announce.getType() == type)) if (announce.isValid() && (announce.getType() == type))
{ {
player.sendPacket(new CreatureSay(0, ChatType.ANNOUNCEMENT, player.getName(), announce.getContent())); player.sendPacket(new CreatureSay(0, //
type == AnnouncementType.CRITICAL ? ChatType.CRITICAL_ANNOUNCE : ChatType.ANNOUNCEMENT, //
player.getName(), announce.getContent()));
} }
} }
} }

View File

@@ -130,7 +130,7 @@ public class SummonEffectsTable
public void addPetEffect(int controlObjectId, Skill skill, int effectCurTime) public void addPetEffect(int controlObjectId, Skill skill, int effectCurTime)
{ {
_petEffects.putIfAbsent(controlObjectId, new ArrayList<>()).add(new SummonEffect(skill, effectCurTime)); _petEffects.computeIfAbsent(controlObjectId, k -> new ArrayList<>()).add(new SummonEffect(skill, effectCurTime));
} }
public boolean containsPetId(int controlObjectId) public boolean containsPetId(int controlObjectId)

View File

@@ -25,6 +25,7 @@ import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -79,29 +80,30 @@ import com.l2jserver.util.data.xml.IXmlReader;
public final class SkillTreesData implements IXmlReader public final class SkillTreesData implements IXmlReader
{ {
// ClassId, HashMap of Skill Hash Code, L2SkillLearn // ClassId, HashMap of Skill Hash Code, L2SkillLearn
private static final Map<ClassId, Map<Integer, L2SkillLearn>> _classSkillTrees = new HashMap<>(); // ClassId, Map of Skill Hash Code, L2SkillLearn
private static final Map<ClassId, Map<Integer, L2SkillLearn>> _transferSkillTrees = new HashMap<>(); private final Map<ClassId, Map<Integer, L2SkillLearn>> _classSkillTrees = new LinkedHashMap<>();
private static final Map<Race, Map<Integer, L2SkillLearn>> _raceSkillTree = new HashMap<>(); private final Map<ClassId, Map<Integer, L2SkillLearn>> _transferSkillTrees = new LinkedHashMap<>();
private static final Map<SubclassType, Map<Integer, L2SkillLearn>> _revelationSkillTree = new HashMap<>(); private static final Map<Race, Map<Integer, L2SkillLearn>> _raceSkillTree = new LinkedHashMap<>();
private static final Map<SubclassType, Map<Integer, L2SkillLearn>> _revelationSkillTree = new LinkedHashMap<>();
// Skill Hash Code, L2SkillLearn // Skill Hash Code, L2SkillLearn
private static final Map<Integer, L2SkillLearn> _collectSkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _collectSkillTree = new LinkedHashMap<>();
private static final Map<Integer, L2SkillLearn> _fishingSkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _fishingSkillTree = new LinkedHashMap<>();
private static final Map<Integer, L2SkillLearn> _pledgeSkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _pledgeSkillTree = new LinkedHashMap<>();
private static final Map<Integer, L2SkillLearn> _subClassSkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _subClassSkillTree = new LinkedHashMap<>();
private static final Map<Integer, L2SkillLearn> _subPledgeSkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _subPledgeSkillTree = new LinkedHashMap<>();
private static final Map<Integer, L2SkillLearn> _transformSkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _transformSkillTree = new LinkedHashMap<>();
private static final Map<Integer, L2SkillLearn> _commonSkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _commonSkillTree = new LinkedHashMap<>();
private static final Map<Integer, L2SkillLearn> _subClassChangeSkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _subClassChangeSkillTree = new LinkedHashMap<>();
private static final Map<Integer, L2SkillLearn> _abilitySkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _abilitySkillTree = new LinkedHashMap<>();
private static final Map<Integer, L2SkillLearn> _alchemySkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _alchemySkillTree = new LinkedHashMap<>();
private static final Map<Integer, L2SkillLearn> _dualClassSkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _dualClassSkillTree = new LinkedHashMap<>();
// Other skill trees // Other skill trees
private static final Map<Integer, L2SkillLearn> _nobleSkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _nobleSkillTree = new LinkedHashMap<>();
private static final Map<Integer, L2SkillLearn> _heroSkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _heroSkillTree = new LinkedHashMap<>();
private static final Map<Integer, L2SkillLearn> _gameMasterSkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _gameMasterSkillTree = new LinkedHashMap<>();
private static final Map<Integer, L2SkillLearn> _gameMasterAuraSkillTree = new HashMap<>(); private static final Map<Integer, L2SkillLearn> _gameMasterAuraSkillTree = new LinkedHashMap<>();
// Remove skill tree // Remove skill tree
private static final Map<ClassId, Set<Integer>> _removeSkillCache = new HashMap<>(); private static final Map<ClassId, Set<Integer>> _removeSkillCache = new LinkedHashMap<>();
// Checker, sorted arrays of hash codes // Checker, sorted arrays of hash codes
private Map<Integer, int[]> _skillsByClassIdHashCodes; // Occupation skills private Map<Integer, int[]> _skillsByClassIdHashCodes; // Occupation skills
@@ -110,8 +112,8 @@ public final class SkillTreesData implements IXmlReader
private boolean _loading = true; private boolean _loading = true;
/** Parent class Ids are read from XML and stored in this map, to allow easy customization. */ /** Parent class IDs are read from XML and stored in this map, to allow easy customization. */
private static final Map<ClassId, ClassId> _parentClassMap = new HashMap<>(); private final Map<ClassId, ClassId> _parentClassMap = new LinkedHashMap<>();
/** /**
* Instantiates a new skill trees data. * Instantiates a new skill trees data.
@@ -418,14 +420,25 @@ public final class SkillTreesData implements IXmlReader
*/ */
public Map<Integer, L2SkillLearn> getCompleteClassSkillTree(ClassId classId) public Map<Integer, L2SkillLearn> getCompleteClassSkillTree(ClassId classId)
{ {
final Map<Integer, L2SkillLearn> skillTree = new HashMap<>(); final Map<Integer, L2SkillLearn> skillTree = new LinkedHashMap<>();
// Add all skills that belong to all classes. // Add all skills that belong to all classes.
skillTree.putAll(_commonSkillTree); skillTree.putAll(_commonSkillTree);
while ((classId != null) && (_classSkillTrees.get(classId) != null))
final LinkedList<ClassId> classSequence = new LinkedList<>();
while (classId != null)
{ {
skillTree.putAll(_classSkillTrees.get(classId)); classSequence.addFirst(classId);
classId = _parentClassMap.get(classId); classId = _parentClassMap.get(classId);
} }
for (ClassId cid : classSequence)
{
final Map<Integer, L2SkillLearn> classSkillTree = _classSkillTrees.get(cid);
if (classSkillTree != null)
{
skillTree.putAll(classSkillTree);
}
}
return skillTree; return skillTree;
} }

View File

@@ -685,7 +685,7 @@ public class L2Attackable extends L2Npc
} }
/** /**
* Add damage and hate to the attacker AggroInfo of the L2Attackable _aggroList. * Adds damage and hate to the attacker aggression list for this character.
* @param attacker The L2Character that gave damages to this L2Attackable * @param attacker The L2Character that gave damages to this L2Attackable
* @param damage The number of damages given by the attacker L2Character * @param damage The number of damages given by the attacker L2Character
* @param aggro The hate (=damage) given by the attacker L2Character * @param aggro The hate (=damage) given by the attacker L2Character
@@ -697,13 +697,14 @@ public class L2Attackable extends L2Npc
return; return;
} }
final L2PcInstance targetPlayer = attacker.getActingPlayer();
// Get the AggroInfo of the attacker L2Character from the _aggroList of the L2Attackable // Get the AggroInfo of the attacker L2Character from the _aggroList of the L2Attackable
final AggroInfo ai = getAggroList().computeIfAbsent(attacker, AggroInfo::new); final AggroInfo ai = getAggroList().computeIfAbsent(attacker, AggroInfo::new);
ai.addDamage(damage); ai.addDamage(damage);
// traps does not cause aggro
// Traps does not cause aggro
// making this hack because not possible to determine if damage made by trap // making this hack because not possible to determine if damage made by trap
// so just check for triggered trap here // so just check for triggered trap here
final L2PcInstance targetPlayer = attacker.getActingPlayer();
if ((targetPlayer == null) || (targetPlayer.getTrap() == null) || !targetPlayer.getTrap().isTriggered()) if ((targetPlayer == null) || (targetPlayer.getTrap() == null) || !targetPlayer.getTrap().isTriggered())
{ {
ai.addHate(aggro); ai.addHate(aggro);

View File

@@ -5387,7 +5387,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
if (newSkill.isPassive()) if (newSkill.isPassive())
{ {
newSkill.applyEffects(this, null, this, false, true, false, 0); newSkill.applyEffects(this, this, false, true, false, 0);
} }
} }
return oldSkill; return oldSkill;
@@ -6070,8 +6070,9 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
} }
} }
} }
// Notify AI // Notify AI
if (skill.isBad() && (skill.getTargetType() != L2TargetType.SELF) && !skill.hasEffectType(L2EffectType.HATE)) if (skill.isBad() && !skill.hasEffectType(L2EffectType.HATE))
{ {
for (L2Object target : targets) for (L2Object target : targets)
{ {
@@ -6080,7 +6081,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
final L2Character creature = (L2Character) target; final L2Character creature = (L2Character) target;
if (creature.hasAI()) if (creature.hasAI())
{ {
// notify target AI about the attack // Notify target AI about the attack
creature.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, this); creature.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, this);
} }
} }

View File

@@ -33,7 +33,6 @@ import com.l2jserver.gameserver.model.L2Object;
import com.l2jserver.gameserver.model.L2Party; import com.l2jserver.gameserver.model.L2Party;
import com.l2jserver.gameserver.model.actor.L2Attackable; import com.l2jserver.gameserver.model.actor.L2Attackable;
import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Playable;
import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.L2Summon;
import com.l2jserver.gameserver.model.actor.tasks.cubics.CubicAction; import com.l2jserver.gameserver.model.actor.tasks.cubics.CubicAction;
import com.l2jserver.gameserver.model.actor.tasks.cubics.CubicDisappear; import com.l2jserver.gameserver.model.actor.tasks.cubics.CubicDisappear;
@@ -356,7 +355,7 @@ public final class L2CubicInstance implements IIdentifiable
{ {
if (_owner.isOlympiadStart()) if (_owner.isOlympiadStart())
{ {
if (ownerTarget instanceof L2Playable) if (ownerTarget.isPlayable())
{ {
final L2PcInstance targetPlayer = ownerTarget.getActingPlayer(); final L2PcInstance targetPlayer = ownerTarget.getActingPlayer();
if ((targetPlayer != null) && (targetPlayer.getOlympiadGameId() == _owner.getOlympiadGameId()) && (targetPlayer.getOlympiadSide() != _owner.getOlympiadSide())) if ((targetPlayer != null) && (targetPlayer.getOlympiadGameId() == _owner.getOlympiadGameId()) && (targetPlayer.getOlympiadSide() != _owner.getOlympiadSide()))
@@ -372,23 +371,24 @@ public final class L2CubicInstance implements IIdentifiable
if (ownerTarget.isCharacter() && (ownerTarget != pet) && !_owner.hasServitor(ownerTarget.getObjectId()) && (ownerTarget != _owner)) if (ownerTarget.isCharacter() && (ownerTarget != pet) && !_owner.hasServitor(ownerTarget.getObjectId()) && (ownerTarget != _owner))
{ {
// target mob which has aggro on you or your summon // target mob which has aggro on you or your summon
if (ownerTarget instanceof L2Attackable) if (ownerTarget.isAttackable())
{ {
if ((((L2Attackable) ownerTarget).getAggroList().get(_owner) != null) && !((L2Attackable) ownerTarget).isDead()) final L2Attackable attackable = (L2Attackable) ownerTarget;
if ((attackable.getAggroList().get(_owner) != null) && !attackable.isDead())
{ {
_target = (L2Character) ownerTarget; _target = (L2Character) ownerTarget;
return; return;
} }
if (_owner.hasSummon()) if (_owner.hasSummon())
{ {
if ((((L2Attackable) ownerTarget).getAggroList().get(pet) != null) && !((L2Attackable) ownerTarget).isDead()) if ((attackable.getAggroList().get(pet) != null) && !attackable.isDead())
{ {
_target = (L2Character) ownerTarget; _target = (L2Character) ownerTarget;
return; return;
} }
for (L2Summon servitor : _owner.getServitors().values()) for (L2Summon servitor : _owner.getServitors().values())
{ {
if ((((L2Attackable) ownerTarget).getAggroList().get(servitor) != null) && !((L2Attackable) ownerTarget).isDead()) if ((attackable.getAggroList().get(servitor) != null) && !attackable.isDead())
{ {
_target = (L2Character) ownerTarget; _target = (L2Character) ownerTarget;
return; return;
@@ -482,21 +482,21 @@ public final class L2CubicInstance implements IIdentifiable
if (skill.isBad()) if (skill.isBad())
{ {
byte shld = Formulas.calcShldUse(getOwner(), target, skill); byte shld = Formulas.calcShldUse(_owner, target, skill);
boolean acted = Formulas.calcCubicSkillSuccess(this, target, skill, shld); boolean acted = Formulas.calcCubicSkillSuccess(this, target, skill, shld);
if (!acted) if (!acted)
{ {
getOwner().sendPacket(SystemMessageId.YOUR_ATTACK_HAS_FAILED); _owner.sendPacket(SystemMessageId.YOUR_ATTACK_HAS_FAILED);
continue; continue;
} }
} }
// Apply effects // Apply effects
skill.applyEffects(getOwner(), this, target, false, false, true, 0); skill.applyEffects(_owner, target, false, false, true, 0);
// If this is a bad skill notify the duel manager, so it can be removed after the duel (player & target must be in the same duel). // If this is a bad skill notify the duel manager, so it can be removed after the duel (player & target must be in the same duel).
if (target.isPlayer() && target.getActingPlayer().isInDuel() && skill.isBad() && (getOwner().getDuelId() == target.getActingPlayer().getDuelId())) if (target.isPlayer() && target.getActingPlayer().isInDuel() && skill.isBad() && (_owner.getDuelId() == target.getActingPlayer().getDuelId()))
{ {
DuelManager.getInstance().onBuff(target.getActingPlayer(), skill); DuelManager.getInstance().onBuff(target.getActingPlayer(), skill);
} }
@@ -504,11 +504,10 @@ public final class L2CubicInstance implements IIdentifiable
} }
/** /**
* @param activeCubic
* @param skill * @param skill
* @param targets * @param targets
*/ */
public void useCubicMdam(L2CubicInstance activeCubic, Skill skill, L2Object[] targets) public void useCubicMdam(Skill skill, L2Object[] targets)
{ {
for (L2Character target : (L2Character[]) targets) for (L2Character target : (L2Character[]) targets)
{ {
@@ -529,9 +528,9 @@ public final class L2CubicInstance implements IIdentifiable
} }
} }
boolean mcrit = Formulas.calcMCrit(activeCubic.getOwner().getMCriticalHit(target, skill)); boolean mcrit = Formulas.calcMCrit(_owner.getMCriticalHit(target, skill));
byte shld = Formulas.calcShldUse(activeCubic.getOwner(), target, skill); byte shld = Formulas.calcShldUse(_owner, target, skill);
int damage = (int) Formulas.calcMagicDam(activeCubic, target, skill, mcrit, shld); int damage = (int) Formulas.calcMagicDam(this, target, skill, mcrit, shld);
if (Config.DEBUG) if (Config.DEBUG)
{ {
@@ -554,14 +553,14 @@ public final class L2CubicInstance implements IIdentifiable
} }
else else
{ {
activeCubic.getOwner().sendDamageMessage(target, damage, mcrit, false, false); _owner.sendDamageMessage(target, damage, mcrit, false, false);
target.reduceCurrentHp(damage, activeCubic.getOwner(), skill); target.reduceCurrentHp(damage, _owner, skill);
} }
} }
} }
} }
public void useCubicDrain(L2CubicInstance activeCubic, Skill skill, L2Object[] targets) public void useCubicDrain(Skill skill, L2Object[] targets)
{ {
if (Config.DEBUG) if (Config.DEBUG)
{ {
@@ -575,10 +574,10 @@ public final class L2CubicInstance implements IIdentifiable
continue; continue;
} }
boolean mcrit = Formulas.calcMCrit(activeCubic.getOwner().getMCriticalHit(target, skill)); boolean mcrit = Formulas.calcMCrit(_owner.getMCriticalHit(target, skill));
byte shld = Formulas.calcShldUse(activeCubic.getOwner(), target, skill); byte shld = Formulas.calcShldUse(_owner, target, skill);
int damage = (int) Formulas.calcMagicDam(activeCubic, target, skill, mcrit, shld); int damage = (int) Formulas.calcMagicDam(this, target, skill, mcrit, shld);
if (Config.DEBUG) if (Config.DEBUG)
{ {
_log.info("L2SkillDrain: useCubicSkill() -> damage = " + damage); _log.info("L2SkillDrain: useCubicSkill() -> damage = " + damage);
@@ -586,7 +585,7 @@ public final class L2CubicInstance implements IIdentifiable
// TODO: Unhardcode fixed value // TODO: Unhardcode fixed value
double hpAdd = (0.4 * damage); double hpAdd = (0.4 * damage);
L2PcInstance owner = activeCubic.getOwner(); L2PcInstance owner = _owner;
double hp = ((owner.getCurrentHp() + hpAdd) > owner.getMaxHp() ? owner.getMaxHp() : (owner.getCurrentHp() + hpAdd)); double hp = ((owner.getCurrentHp() + hpAdd) > owner.getMaxHp() ? owner.getMaxHp() : (owner.getCurrentHp() + hpAdd));
owner.setCurrentHp(hp); owner.setCurrentHp(hp);
@@ -594,7 +593,7 @@ public final class L2CubicInstance implements IIdentifiable
// Check to see if we should damage the target // Check to see if we should damage the target
if ((damage > 0) && !target.isDead()) if ((damage > 0) && !target.isDead())
{ {
target.reduceCurrentHp(damage, activeCubic.getOwner(), skill); target.reduceCurrentHp(damage, _owner, skill);
// Manage attack or cast break of the target (calculating rate, sending message...) // Manage attack or cast break of the target (calculating rate, sending message...)
if (!target.isRaid() && Formulas.calcAtkBreak(target, damage)) if (!target.isRaid() && Formulas.calcAtkBreak(target, damage))
@@ -621,17 +620,17 @@ public final class L2CubicInstance implements IIdentifiable
continue; continue;
} }
byte shld = Formulas.calcShldUse(getOwner(), target, skill); byte shld = Formulas.calcShldUse(_owner, target, skill);
if (skill.hasEffectType(L2EffectType.STUN, L2EffectType.PARALYZE, L2EffectType.ROOT)) if (skill.hasEffectType(L2EffectType.STUN, L2EffectType.PARALYZE, L2EffectType.ROOT))
{ {
if (Formulas.calcCubicSkillSuccess(this, target, skill, shld)) if (Formulas.calcCubicSkillSuccess(this, target, skill, shld))
{ {
// Apply effects // Apply effects
skill.applyEffects(getOwner(), this, target, false, false, true, 0); skill.applyEffects(_owner, target, false, false, true, 0);
// If this is a bad skill notify the duel manager, so it can be removed after the duel (player & target must be in the same duel). // If this is a bad skill notify the duel manager, so it can be removed after the duel (player & target must be in the same duel).
if (target.isPlayer() && target.getActingPlayer().isInDuel() && skill.isBad() && (getOwner().getDuelId() == target.getActingPlayer().getDuelId())) if (target.isPlayer() && target.getActingPlayer().isInDuel() && skill.isBad() && (_owner.getDuelId() == target.getActingPlayer().getDuelId()))
{ {
DuelManager.getInstance().onBuff(target.getActingPlayer(), skill); DuelManager.getInstance().onBuff(target.getActingPlayer(), skill);
} }
@@ -656,11 +655,11 @@ public final class L2CubicInstance implements IIdentifiable
{ {
if (target.isAttackable()) if (target.isAttackable())
{ {
target.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, getOwner(), (int) ((150 * skill.getPower()) / (target.getLevel() + 7))); target.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, _owner, (int) ((150 * skill.getPower()) / (target.getLevel() + 7)));
} }
// Apply effects // Apply effects
skill.applyEffects(getOwner(), this, target, false, false, true, 0); skill.applyEffects(_owner, target, false, false, true, 0);
if (Config.DEBUG) if (Config.DEBUG)
{ {

View File

@@ -121,100 +121,102 @@ public final class CubicAction implements Runnable
} }
else if (Rnd.get(1, 100) < _chance) else if (Rnd.get(1, 100) < _chance)
{ {
Skill skill = _cubic.getSkills().get(Rnd.get(_cubic.getSkills().size())); final Skill skill = _cubic.getSkills().get(Rnd.get(_cubic.getSkills().size()));
if (skill != null) if (skill == null)
{ {
if (skill.getId() == L2CubicInstance.SKILL_CUBIC_HEAL) return;
}
if (skill.getId() == L2CubicInstance.SKILL_CUBIC_HEAL)
{
// friendly skill, so we look a target in owner's party
_cubic.cubicTargetForHeal();
}
else
{
// offensive skill, we look for an enemy target
_cubic.getCubicTarget();
if (!L2CubicInstance.isInCubicRange(_cubic.getOwner(), _cubic.getTarget()))
{ {
// friendly skill, so we look a target in owner's party _cubic.setTarget(null);
_cubic.cubicTargetForHeal();
} }
else }
L2Character target = _cubic.getTarget();
if ((target != null) && !target.isDead())
{
if (Config.DEBUG)
{ {
// offensive skill, we look for an enemy target _log.info("L2CubicInstance: Action.run();");
_cubic.getCubicTarget(); _log.info("Cubic ID: " + _cubic.getId() + " Target: " + target.getName() + " distance: " + target.calculateDistance(_cubic.getOwner(), true, false));
if (!L2CubicInstance.isInCubicRange(_cubic.getOwner(), _cubic.getTarget()))
{
_cubic.setTarget(null);
}
} }
L2Character target = _cubic.getTarget();
if ((target != null) && !target.isDead()) _cubic.getOwner().broadcastPacket(new MagicSkillUse(_cubic.getOwner(), target, skill.getId(), skill.getLevel(), 0, 0));
L2Character[] targets =
{
target
};
if (skill.isContinuous())
{ {
if (Config.DEBUG) if (Config.DEBUG)
{ {
_log.info("L2CubicInstance: Action.run();"); _log.info("L2CubicInstance: Action.run() skill " + skill);
_log.info("Cubic ID: " + _cubic.getId() + " Target: " + target.getName() + " distance: " + target.calculateDistance(_cubic.getOwner(), true, false));
} }
_cubic.useCubicContinuous(skill, targets);
_cubic.getOwner().broadcastPacket(new MagicSkillUse(_cubic.getOwner(), target, skill.getId(), skill.getLevel(), 0, 0));
L2Character[] targets =
{
target
};
if (skill.isContinuous())
{
if (Config.DEBUG)
{
_log.info("L2CubicInstance: Action.run() skill " + skill);
}
_cubic.useCubicContinuous(skill, targets);
}
else
{
skill.activateSkill(_cubic.getOwner(), targets);
if (Config.DEBUG)
{
_log.info("L2CubicInstance: Action.run(); other handler");
}
}
if (skill.hasEffectType(L2EffectType.MAGICAL_ATTACK))
{
if (Config.DEBUG)
{
_log.info("L2CubicInstance: Action.run() skill " + skill);
}
_cubic.useCubicMdam(_cubic, skill, targets);
}
else if (skill.hasEffectType(L2EffectType.HP_DRAIN))
{
if (Config.DEBUG)
{
_log.info("L2CubicInstance: Action.run() skill " + skill);
}
_cubic.useCubicDrain(_cubic, skill, targets);
}
else if (skill.hasEffectType(L2EffectType.STUN, L2EffectType.ROOT, L2EffectType.PARALYZE))
{
if (Config.DEBUG)
{
_log.info("L2CubicInstance: Action.run() skill " + skill);
}
_cubic.useCubicDisabler(skill, targets);
}
else if (skill.hasEffectType(L2EffectType.DMG_OVER_TIME, L2EffectType.DMG_OVER_TIME_PERCENT))
{
if (Config.DEBUG)
{
_log.info("L2CubicInstance: Action.run() skill " + skill);
}
_cubic.useCubicContinuous(skill, targets);
}
else if (skill.hasEffectType(L2EffectType.AGGRESSION))
{
if (Config.DEBUG)
{
_log.info("L2CubicInstance: Action.run() skill " + skill);
}
_cubic.useCubicDisabler(skill, targets);
}
// The cubic has done an action, increase the current count
_currentCount.incrementAndGet();
} }
else
{
skill.activateSkill(_cubic, targets);
if (Config.DEBUG)
{
_log.info("L2CubicInstance: Action.run(); other handler");
}
}
if (skill.hasEffectType(L2EffectType.MAGICAL_ATTACK))
{
if (Config.DEBUG)
{
_log.info("L2CubicInstance: Action.run() skill " + skill);
}
_cubic.useCubicMdam(skill, targets);
}
else if (skill.hasEffectType(L2EffectType.HP_DRAIN))
{
if (Config.DEBUG)
{
_log.info("L2CubicInstance: Action.run() skill " + skill);
}
_cubic.useCubicDrain(skill, targets);
}
else if (skill.hasEffectType(L2EffectType.STUN, L2EffectType.ROOT, L2EffectType.PARALYZE))
{
if (Config.DEBUG)
{
_log.info("L2CubicInstance: Action.run() skill " + skill);
}
_cubic.useCubicDisabler(skill, targets);
}
else if (skill.hasEffectType(L2EffectType.DMG_OVER_TIME, L2EffectType.DMG_OVER_TIME_PERCENT))
{
if (Config.DEBUG)
{
_log.info("L2CubicInstance: Action.run() skill " + skill);
}
_cubic.useCubicContinuous(skill, targets);
}
else if (skill.hasEffectType(L2EffectType.AGGRESSION))
{
if (Config.DEBUG)
{
_log.info("L2CubicInstance: Action.run() skill " + skill);
}
_cubic.useCubicDisabler(skill, targets);
}
// The cubic has done an action, increase the current count
_currentCount.incrementAndGet();
} }
} }
} }

View File

@@ -56,35 +56,24 @@ public class CubicHeal implements Runnable
_cubic.cancelDisappear(); _cubic.cancelDisappear();
return; return;
} }
try try
{ {
Skill skill = null; final Skill skill = _cubic.getSkills().stream().filter(s -> s.getId() == L2CubicInstance.SKILL_CUBIC_HEAL).findFirst().orElse(null);
for (Skill sk : _cubic.getSkills()) if (skill == null)
{ {
if (sk.getId() == L2CubicInstance.SKILL_CUBIC_HEAL) return;
{
skill = sk;
break;
}
} }
if (skill != null) _cubic.cubicTargetForHeal();
final L2Character target = _cubic.getTarget();
if ((target != null) && !target.isDead())
{ {
_cubic.cubicTargetForHeal(); if ((target.getMaxHp() - target.getCurrentHp()) > skill.getPower())
final L2Character target = _cubic.getTarget();
if ((target != null) && !target.isDead())
{ {
if ((target.getMaxHp() - target.getCurrentHp()) > skill.getPower()) skill.activateSkill(_cubic, target);
{
L2Character[] targets = _cubic.getOwner().broadcastPacket(new MagicSkillUse(_cubic.getOwner(), target, skill.getId(), skill.getLevel(), 0, 0));
{
target
};
skill.activateSkill(_cubic.getOwner(), targets);
_cubic.getOwner().broadcastPacket(new MagicSkillUse(_cubic.getOwner(), target, skill.getId(), skill.getLevel(), 0, 0));
}
} }
} }
} }

View File

@@ -135,7 +135,7 @@ public class TvTEventTeam
} }
/** /**
* Returns name and instance of all participated players in FastMap<br> * Returns name and instance of all participated players in Map<br>
* <br> * <br>
* @return Map<String, L2PcInstance>: map of players in this team<br> * @return Map<String, L2PcInstance>: map of players in this team<br>
*/ */

View File

@@ -97,7 +97,7 @@ public class LongTimeEvent extends Quest
{ {
long delay = _eventPeriod.getStartDate().getTime() - System.currentTimeMillis(); long delay = _eventPeriod.getStartDate().getTime() - System.currentTimeMillis();
ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleStart(), delay); ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleStart(), delay);
_log.info("Event " + _eventName + " will be started at " + _eventPeriod.getEndDate()); _log.info("Event " + _eventName + " will be started at " + _eventPeriod.getStartDate());
} }
else else
{ {
@@ -266,17 +266,21 @@ public class LongTimeEvent extends Quest
*/ */
protected void startEvent() protected void startEvent()
{ {
long currentTime = System.currentTimeMillis();
// Add drop // Add drop
if (_dropList != null) if (_dropList != null)
{ {
for (GeneralDropItem drop : _dropList) if (currentTime < _dropPeriod.getEndDate().getTime())
{ {
EventDroplist.getInstance().addGlobalDrop(drop.getItemId(), drop.getMin(), drop.getMax(), (int) drop.getChance(), _dropPeriod); for (GeneralDropItem drop : _dropList)
{
EventDroplist.getInstance().addGlobalDrop(drop.getItemId(), drop.getMin(), drop.getMax(), (int) drop.getChance(), _dropPeriod);
}
} }
} }
// Add spawns // Add spawns
Long millisToEventEnd = _eventPeriod.getEndDate().getTime() - System.currentTimeMillis(); Long millisToEventEnd = _eventPeriod.getEndDate().getTime() - currentTime;
if (_spawnList != null) if (_spawnList != null)
{ {
for (NpcSpawn spawn : _spawnList) for (NpcSpawn spawn : _spawnList)

View File

@@ -385,12 +385,7 @@ public abstract class Inventory extends ItemContainer
final Skill unequipSkill = it.getUnequipSkill(); final Skill unequipSkill = it.getUnequipSkill();
if (unequipSkill != null) if (unequipSkill != null)
{ {
L2PcInstance[] targets = unequipSkill.activateSkill(player, player);
{
player
};
unequipSkill.activateSkill(player, targets);
} }
// Remove itemEquip skill // Remove itemEquip skill
@@ -492,12 +487,7 @@ public abstract class Inventory extends ItemContainer
final Skill itemEquipSkill = it.getEquipSkill(); final Skill itemEquipSkill = it.getEquipSkill();
if (itemEquipSkill != null) if (itemEquipSkill != null)
{ {
L2PcInstance[] targets = itemEquipSkill.activateSkill(player, player);
{
player
};
itemEquipSkill.activateSkill(player, targets);
} }
if (update) if (update)

View File

@@ -365,12 +365,7 @@ public final class L2Weapon extends L2Item
return; return;
} }
L2Character[] targets = onCritSkill.activateSkill(caster, target);
{
target
};
onCritSkill.activateSkill(caster, targets);
} }
/** /**
@@ -429,18 +424,18 @@ public final class L2Weapon extends L2Item
return; return;
} }
L2Character[] targets =
{
target
};
// Launch the magic skill and calculate its effects // Launch the magic skill and calculate its effects
// Get the skill handler corresponding to the skill type // Get the skill handler corresponding to the skill type
onMagicSkill.activateSkill(caster, targets); onMagicSkill.activateSkill(caster, target);
// notify quests of a skill use // notify quests of a skill use
if (caster instanceof L2PcInstance) if (caster instanceof L2PcInstance)
{ {
L2Character[] targets =
{
target
};
//@formatter:off //@formatter:off
caster.getKnownList().getKnownObjects().values().stream() caster.getKnownList().getKnownObjects().values().stream()
.filter(Objects::nonNull) .filter(Objects::nonNull)

View File

@@ -221,8 +221,8 @@ public final class QuestState
* <ul> * <ul>
* <li>Initialize class variable "vars" if is null.</li> * <li>Initialize class variable "vars" if is null.</li>
* <li>Initialize parameter "val" if is null</li> * <li>Initialize parameter "val" if is null</li>
* <li>Add/Update couple (var,val) in class variable HashMap "vars"</li> * <li>Add/Update couple (var,val) in class variable Map "vars"</li>
* <li>If the key represented by "var" exists in HashMap "vars", the couple (var,val) is updated in the database.<br> * <li>If the key represented by "var" exists in Map "vars", the couple (var,val) is updated in the database.<br>
* The key is known as existing if the preceding value of the key (given as result of function put()) is not null.<br> * The key is known as existing if the preceding value of the key (given as result of function put()) is not null.<br>
* If the key doesn't exist, the couple is added/created in the database</li> * If the key doesn't exist, the couple is added/created in the database</li>
* <ul> * <ul>

View File

@@ -886,7 +886,7 @@ public final class Skill implements IIdentifiable
public boolean useSoulShot() public boolean useSoulShot()
{ {
return (hasEffectType(L2EffectType.PHYSICAL_ATTACK, L2EffectType.PHYSICAL_ATTACK_HP_LINK)); return hasEffectType(L2EffectType.PHYSICAL_ATTACK, L2EffectType.PHYSICAL_ATTACK_HP_LINK);
} }
public boolean useSpiritShot() public boolean useSpiritShot()
@@ -1324,18 +1324,18 @@ public final class Skill implements IIdentifiable
} }
/** /**
* Method overload for {@link Skill#applyEffects(L2Character, L2CubicInstance, L2Character, boolean, boolean, boolean, int)}.<br> * Method overload for {@link Skill#applyEffects(L2Character, L2Character, boolean, boolean, boolean, int)}.<br>
* Simplify the calls. * Simplify the calls.
* @param effector the caster of the skill * @param effector the caster of the skill
* @param effected the target of the effect * @param effected the target of the effect
*/ */
public void applyEffects(L2Character effector, L2Character effected) public void applyEffects(L2Character effector, L2Character effected)
{ {
applyEffects(effector, null, effected, false, false, true, 0); applyEffects(effector, effected, false, false, true, 0);
} }
/** /**
* Method overload for {@link Skill#applyEffects(L2Character, L2CubicInstance, L2Character, boolean, boolean, boolean, int)}.<br> * Method overload for {@link Skill#applyEffects(L2Character, L2Character, boolean, boolean, boolean, int)}.<br>
* Simplify the calls, allowing abnormal time time customization. * Simplify the calls, allowing abnormal time time customization.
* @param effector the caster of the skill * @param effector the caster of the skill
* @param effected the target of the effect * @param effected the target of the effect
@@ -1344,20 +1344,19 @@ public final class Skill implements IIdentifiable
*/ */
public void applyEffects(L2Character effector, L2Character effected, boolean instant, int abnormalTime) public void applyEffects(L2Character effector, L2Character effected, boolean instant, int abnormalTime)
{ {
applyEffects(effector, null, effected, false, false, instant, abnormalTime); applyEffects(effector, effected, false, false, instant, abnormalTime);
} }
/** /**
* Applies the effects from this skill to the target. * Applies the effects from this skill to the target.
* @param effector the caster of the skill * @param effector the caster of the skill
* @param cubic the cubic that cast the skill, can be {@code null}
* @param effected the target of the effect * @param effected the target of the effect
* @param self if {@code true} self-effects will be casted on the caster * @param self if {@code true} self-effects will be casted on the caster
* @param passive if {@code true} passive effects will be applied to the effector * @param passive if {@code true} passive effects will be applied to the effector
* @param instant if {@code true} instant effects will be applied to the effected * @param instant if {@code true} instant effects will be applied to the effected
* @param abnormalTime custom abnormal time, if equal or lesser than zero will be ignored * @param abnormalTime custom abnormal time, if equal or lesser than zero will be ignored
*/ */
public void applyEffects(L2Character effector, L2CubicInstance cubic, L2Character effected, boolean self, boolean passive, boolean instant, int abnormalTime) public void applyEffects(L2Character effector, L2Character effected, boolean self, boolean passive, boolean instant, int abnormalTime)
{ {
// null targets cannot receive any effects. // null targets cannot receive any effects.
if (effected == null) if (effected == null)
@@ -1449,11 +1448,32 @@ public final class Skill implements IIdentifiable
} }
/** /**
* Activates the skill to the targets. * Activates a skill for the given creature and targets.
* @param caster the caster * @param caster the caster
* @param targets the targets * @param targets the targets
*/ */
public void activateSkill(L2Character caster, L2Object[] targets) public void activateSkill(L2Character caster, L2Object... targets)
{
activateSkill(caster, null, targets);
}
/**
* Activates a skill for the given cubic and targets.
* @param cubic the cubic
* @param targets the targets
*/
public void activateSkill(L2CubicInstance cubic, L2Object... targets)
{
activateSkill(cubic.getOwner(), cubic, targets);
}
/**
* Activates the skill to the targets.
* @param caster the caster
* @param cubic the cubic, can be {@code null}
* @param targets the targets
*/
private void activateSkill(L2Character caster, L2CubicInstance cubic, L2Object... targets)
{ {
switch (getId()) switch (getId())
{ {
@@ -1525,16 +1545,19 @@ public final class Skill implements IIdentifiable
{ {
caster.stopSkillEffects(true, getId()); caster.stopSkillEffects(true, getId());
} }
applyEffects(caster, null, caster, true, false, true, 0); applyEffects(caster, caster, true, false, true, 0);
} }
if (useSpiritShot()) if (cubic == null)
{ {
caster.setChargedShot(caster.isChargedShot(ShotType.BLESSED_SPIRITSHOTS) ? ShotType.BLESSED_SPIRITSHOTS : ShotType.SPIRITSHOTS, false); if (useSpiritShot())
} {
else if (useSoulShot()) caster.setChargedShot(caster.isChargedShot(ShotType.BLESSED_SPIRITSHOTS) ? ShotType.BLESSED_SPIRITSHOTS : ShotType.SPIRITSHOTS, false);
{ }
caster.setChargedShot(ShotType.SOULSHOTS, false); else if (useSoulShot())
{
caster.setChargedShot(ShotType.SOULSHOTS, false);
}
} }
} }

View File

@@ -65,7 +65,8 @@ public class DateRange
public boolean isWithinRange(Date date) public boolean isWithinRange(Date date)
{ {
return date.after(_startDate) && date.before(_endDate); return (date.equals(_startDate) || date.after(_startDate)) //
&& (date.equals(_endDate) || date.before(_endDate));
} }
public Date getEndDate() public Date getEndDate()

View File

@@ -18,20 +18,23 @@
*/ */
package com.l2jserver.util; package com.l2jserver.util;
import java.net.Inet4Address;
import java.net.InetAddress; import java.net.InetAddress;
import java.nio.channels.SocketChannel; import java.nio.channels.SocketChannel;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.logging.Logger;
import commons.mmocore.IAcceptFilter; import commons.mmocore.IAcceptFilter;
/** /**
* IPv4 filter. * IPv4 filter.
* @author Forsaiken * @author Forsaiken, Zoey76
*/ */
public class IPv4Filter implements IAcceptFilter, Runnable public class IPv4Filter implements IAcceptFilter, Runnable
{ {
private static final Logger LOG = Logger.getLogger(IPv4Filter.class.getName());
private final HashMap<Integer, Flood> _ipFloodMap; private final HashMap<Integer, Flood> _ipFloodMap;
private static final long SLEEP_TIME = 5000; private static final long SLEEP_TIME = 5000;
@@ -67,9 +70,14 @@ public class IPv4Filter implements IAcceptFilter, Runnable
@Override @Override
public boolean accept(SocketChannel sc) public boolean accept(SocketChannel sc)
{ {
InetAddress addr = sc.socket().getInetAddress(); final InetAddress addr = sc.socket().getInetAddress();
int h = hash(addr.getAddress()); if (!(addr instanceof Inet4Address))
{
LOG.info(IPv4Filter.class.getSimpleName() + ": Someone tried to connect from something other than IPv4: " + addr.getHostAddress());
return false;
}
final int h = hash(addr.getAddress());
long current = System.currentTimeMillis(); long current = System.currentTimeMillis();
Flood f; Flood f;
synchronized (_ipFloodMap) synchronized (_ipFloodMap)