Free version update 14-12-2023.
This commit is contained in:
@@ -170,7 +170,6 @@ public class LionelHunter extends AbstractNpcAI
|
||||
htmltext = "33907-not-completed.html";
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
return htmltext;
|
||||
@@ -186,4 +185,4 @@ public class LionelHunter extends AbstractNpcAI
|
||||
{
|
||||
new LionelHunter();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,181 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.areas.Rune.SwampOfScreams;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import org.l2jmobius.commons.util.CommonUtil;
|
||||
import org.l2jmobius.gameserver.data.xml.SpawnData;
|
||||
import org.l2jmobius.gameserver.model.World;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
|
||||
import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
|
||||
import org.l2jmobius.gameserver.network.NpcStringId;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* @author Tanatos
|
||||
*/
|
||||
public class SwampOfScreamsSiege extends AbstractNpcAI
|
||||
{
|
||||
// NPCs
|
||||
private static final int[] SWAMP_MONSTERS =
|
||||
{
|
||||
24570,
|
||||
24571,
|
||||
24572,
|
||||
24573
|
||||
};
|
||||
private static final int SWAMP_PETRA = 24574;
|
||||
private static final AtomicReference<SpawnTemplate> SPAWN_SWAMP_MONSTERS = new AtomicReference<>();
|
||||
// Misc
|
||||
private static final int[] DAYS_OF_WEEK =
|
||||
{
|
||||
Calendar.MONDAY,
|
||||
Calendar.TUESDAY,
|
||||
Calendar.WEDNESDAY,
|
||||
Calendar.THURSDAY,
|
||||
Calendar.FRIDAY,
|
||||
Calendar.SATURDAY,
|
||||
Calendar.SUNDAY
|
||||
};
|
||||
// Schedule: 13-15 & 22-24
|
||||
private static final int[] DAY_TIME =
|
||||
{
|
||||
13,
|
||||
00
|
||||
};
|
||||
private static final int[] NIGHT_TIME =
|
||||
{
|
||||
22,
|
||||
00
|
||||
};
|
||||
private static final long DESPAWN_DELAY = 7200000;
|
||||
private static boolean _daytime = false;
|
||||
|
||||
private SwampOfScreamsSiege()
|
||||
{
|
||||
addKillId(SWAMP_MONSTERS);
|
||||
scheduleDayTime();
|
||||
scheduleNightTime();
|
||||
LOGGER.info("Swamp of Screams siege starts from 13:00 to 15:00 and from 22:00 to 00:00.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, Npc npc, Player player)
|
||||
{
|
||||
switch (event)
|
||||
{
|
||||
case "day_time_spawn":
|
||||
{
|
||||
World.getInstance().getPlayers().forEach(p -> showOnScreenMsg(p, NpcStringId.EVENT_ALARM_13_00_15_00_NKILL_THE_MONSTERS_APPEARED_IN_THE_SWAMP_OF_SCREAMS, 2, 10000, true));
|
||||
SPAWN_SWAMP_MONSTERS.set(SpawnData.getInstance().getSpawnByName("SwampOfScreamsMonsters"));
|
||||
SPAWN_SWAMP_MONSTERS.get().getGroups().forEach(SpawnGroup::spawnAll);
|
||||
_daytime = true;
|
||||
startQuestTimer("despawn", DESPAWN_DELAY, null, null);
|
||||
break;
|
||||
}
|
||||
case "night_time_spawn":
|
||||
{
|
||||
World.getInstance().getPlayers().forEach(p -> showOnScreenMsg(p, NpcStringId.EVENT_ALARM_22_00_24_00_NKILL_THE_MONSTERS_APPEARED_IN_THE_SWAMP_OF_SCREAMS, 2, 10000, true));
|
||||
SPAWN_SWAMP_MONSTERS.set(SpawnData.getInstance().getSpawnByName("SwampOfScreamsMonsters"));
|
||||
SPAWN_SWAMP_MONSTERS.get().getGroups().forEach(SpawnGroup::spawnAll);
|
||||
_daytime = false;
|
||||
startQuestTimer("despawn", DESPAWN_DELAY, null, null);
|
||||
break;
|
||||
}
|
||||
case "despawn":
|
||||
{
|
||||
if (_daytime)
|
||||
{
|
||||
World.getInstance().getPlayers().forEach(p -> showOnScreenMsg(p, NpcStringId.EVENT_ALARM_22_00_24_00_NMONSTERS_OF_THE_SWAMP_OF_SCREAMS_ARE_DEFEATED, 2, 10000, true));
|
||||
}
|
||||
else
|
||||
{
|
||||
World.getInstance().getPlayers().forEach(p -> showOnScreenMsg(p, NpcStringId.EVENT_ALARM_13_00_15_00_NMONSTERS_OF_THE_SWAMP_OF_SCREAMS_ARE_DEFEATED, 2, 10000, true));
|
||||
}
|
||||
SPAWN_SWAMP_MONSTERS.set(SpawnData.getInstance().getSpawnByName("SwampOfScreamsMonsters"));
|
||||
SPAWN_SWAMP_MONSTERS.get().getGroups().forEach(SpawnGroup::despawnAll);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onKill(Npc npc, Player killer, boolean isSummon)
|
||||
{
|
||||
if ((CommonUtil.contains(SWAMP_MONSTERS, npc.getId())) && (getRandom(100) < 3))
|
||||
{
|
||||
addSpawn(SWAMP_PETRA, npc.getLocation(), false, 600000, false);
|
||||
}
|
||||
return super.onKill(npc, killer, isSummon);
|
||||
}
|
||||
|
||||
private void scheduleDayTime()
|
||||
{
|
||||
long time = Long.MAX_VALUE;
|
||||
for (int day : DAYS_OF_WEEK)
|
||||
{
|
||||
final long nextDateMillis = getNextDateMilis(day, DAY_TIME[0], DAY_TIME[1]);
|
||||
if (nextDateMillis < time)
|
||||
{
|
||||
time = nextDateMillis;
|
||||
}
|
||||
}
|
||||
startQuestTimer("day_time_spawn", time - System.currentTimeMillis(), null, null);
|
||||
}
|
||||
|
||||
private void scheduleNightTime()
|
||||
{
|
||||
long time = Long.MAX_VALUE;
|
||||
for (int day : DAYS_OF_WEEK)
|
||||
{
|
||||
final long nextDateMillis = getNextDateMilis(day, NIGHT_TIME[0], NIGHT_TIME[1]);
|
||||
if (nextDateMillis < time)
|
||||
{
|
||||
time = nextDateMillis;
|
||||
}
|
||||
}
|
||||
startQuestTimer("night_time_spawn", time - System.currentTimeMillis(), null, null);
|
||||
}
|
||||
|
||||
private long getNextDateMilis(int dayOfWeek, int hour, int minute)
|
||||
{
|
||||
final Calendar calendar = Calendar.getInstance();
|
||||
calendar.set(Calendar.HOUR_OF_DAY, hour);
|
||||
calendar.set(Calendar.MINUTE, minute);
|
||||
calendar.set(Calendar.SECOND, 0);
|
||||
for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if ((calendar.get(Calendar.DAY_OF_WEEK) == dayOfWeek) && (calendar.getTimeInMillis() > System.currentTimeMillis()))
|
||||
{
|
||||
return calendar.getTimeInMillis();
|
||||
}
|
||||
calendar.add(Calendar.DAY_OF_WEEK, 1);
|
||||
}
|
||||
return calendar.getTimeInMillis();
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new SwampOfScreamsSiege();
|
||||
}
|
||||
}
|
@@ -37,6 +37,7 @@ import org.l2jmobius.gameserver.model.actor.Creature;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.actor.Summon;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.Door;
|
||||
import org.l2jmobius.gameserver.model.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
||||
@@ -235,6 +236,8 @@ public class TvT extends Event
|
||||
final InstanceManager manager = InstanceManager.getInstance();
|
||||
final InstanceTemplate template = manager.getInstanceTemplate(INSTANCE_ID);
|
||||
PVP_WORLD = manager.createInstance(template, null);
|
||||
// Make sure doors are closed.
|
||||
PVP_WORLD.getDoors().forEach(Door::closeMe);
|
||||
// Randomize player list and separate teams.
|
||||
final List<Player> playerList = new ArrayList<>(PLAYER_LIST.size());
|
||||
playerList.addAll(PLAYER_LIST);
|
||||
|
@@ -43,6 +43,8 @@ public class EffectMasterHandler
|
||||
EffectHandler.getInstance().registerHandler("AdditionalPotionHp", AdditionalPotionHp::new);
|
||||
EffectHandler.getInstance().registerHandler("AdditionalPotionMp", AdditionalPotionMp::new);
|
||||
EffectHandler.getInstance().registerHandler("AddPcCafePoints", AddPcCafePoints::new);
|
||||
EffectHandler.getInstance().registerHandler("AddMaxPhysicalCriticalRate", AddMaxPhysicalCriticalRate::new);
|
||||
EffectHandler.getInstance().registerHandler("AddMaxMagicCriticalRate", AddMaxMagicCriticalRate::new);
|
||||
EffectHandler.getInstance().registerHandler("AddSkillBySkill", AddSkillBySkill::new);
|
||||
EffectHandler.getInstance().registerHandler("AddTeleportBookmarkSlot", AddTeleportBookmarkSlot::new);
|
||||
EffectHandler.getInstance().registerHandler("AgathionSlot", AgathionSlot::new);
|
||||
@@ -198,6 +200,7 @@ public class EffectMasterHandler
|
||||
EffectHandler.getInstance().registerHandler("HpRegen", HpRegen::new);
|
||||
EffectHandler.getInstance().registerHandler("HpToOwner", HpToOwner::new);
|
||||
EffectHandler.getInstance().registerHandler("IgnoreDeath", IgnoreDeath::new);
|
||||
EffectHandler.getInstance().registerHandler("IgnoreReduceDamage", IgnoreReduceDamage::new);
|
||||
EffectHandler.getInstance().registerHandler("ImmobileDamageBonus", ImmobileDamageBonus::new);
|
||||
EffectHandler.getInstance().registerHandler("ImmobileDamageResist", ImmobileDamageResist::new);
|
||||
EffectHandler.getInstance().registerHandler("ImmobilePetBuff", ImmobilePetBuff::new);
|
||||
@@ -237,7 +240,6 @@ public class EffectMasterHandler
|
||||
EffectHandler.getInstance().registerHandler("MAtk", MAtk::new);
|
||||
EffectHandler.getInstance().registerHandler("MaxCp", MaxCp::new);
|
||||
EffectHandler.getInstance().registerHandler("MaxHp", MaxHp::new);
|
||||
EffectHandler.getInstance().registerHandler("MaxMagicCriticalRate", MaxMagicCriticalRate::new);
|
||||
EffectHandler.getInstance().registerHandler("MaxMp", MaxMp::new);
|
||||
EffectHandler.getInstance().registerHandler("ModifyVital", ModifyVital::new);
|
||||
EffectHandler.getInstance().registerHandler("Mp", Mp::new);
|
||||
|
@@ -48,6 +48,7 @@ public class SkillConditionMasterHandler
|
||||
SkillConditionHandler.getInstance().registerHandler("CanUseInDragonLair", CanUseInDragonLairSkillCondition::new);
|
||||
SkillConditionHandler.getInstance().registerHandler("CanUseSwoopCannon", CanUseSwoopCannonSkillCondition::new);
|
||||
SkillConditionHandler.getInstance().registerHandler("HasVitalityPoints", HasVitalityPointsSkillCondition::new);
|
||||
SkillConditionHandler.getInstance().registerHandler("CanUseSymbolSealIncreaseItem", CanUseSymbolSealIncreaseItemSkillCondition::new);
|
||||
SkillConditionHandler.getInstance().registerHandler("CanUseVitalityIncreaseItem", CanUseVitalityIncreaseItemSkillCondition::new);
|
||||
SkillConditionHandler.getInstance().registerHandler("CheckLevel", CheckLevelSkillCondition::new);
|
||||
SkillConditionHandler.getInstance().registerHandler("CheckSex", CheckSexSkillCondition::new);
|
||||
|
@@ -1,31 +1,31 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
import org.l2jmobius.gameserver.model.stats.Stat;
|
||||
|
||||
/**
|
||||
* @author Mobius
|
||||
*/
|
||||
public class MaxMagicCriticalRate extends AbstractStatEffect
|
||||
{
|
||||
public MaxMagicCriticalRate(StatSet params)
|
||||
{
|
||||
super(params, Stat.MAX_MAGIC_CRITICAL_RATE);
|
||||
}
|
||||
}
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
import org.l2jmobius.gameserver.model.stats.Stat;
|
||||
|
||||
/**
|
||||
* @author fruit
|
||||
*/
|
||||
public class AddMaxMagicCriticalRate extends AbstractStatEffect
|
||||
{
|
||||
public AddMaxMagicCriticalRate(StatSet params)
|
||||
{
|
||||
super(params, Stat.ADD_MAX_MAGIC_CRITICAL_RATE);
|
||||
}
|
||||
}
|
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
import org.l2jmobius.gameserver.model.stats.Stat;
|
||||
|
||||
/**
|
||||
* @author fruit
|
||||
*/
|
||||
public class AddMaxPhysicalCriticalRate extends AbstractStatEffect
|
||||
{
|
||||
public AddMaxPhysicalCriticalRate(StatSet params)
|
||||
{
|
||||
super(params, Stat.ADD_MAX_PHYSICAL_CRITICAL_RATE);
|
||||
}
|
||||
}
|
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.commons.threads.ThreadPool;
|
||||
import org.l2jmobius.commons.util.Rnd;
|
||||
import org.l2jmobius.gameserver.data.xml.SkillData;
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
@@ -26,6 +27,7 @@ import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||
import org.l2jmobius.gameserver.model.skill.BuffInfo;
|
||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||
import org.l2jmobius.gameserver.model.skill.SkillCaster;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillUse;
|
||||
|
||||
/**
|
||||
* Call Skill effect implementation.
|
||||
@@ -58,7 +60,7 @@ public class CallSkill extends AbstractEffect
|
||||
return;
|
||||
}
|
||||
|
||||
Skill triggerSkill = null;
|
||||
final Skill triggerSkill;
|
||||
if (_skillLevelScaleTo <= 0)
|
||||
{
|
||||
// Mobius: Use 0 to trigger max effector learned skill level.
|
||||
@@ -72,6 +74,7 @@ public class CallSkill extends AbstractEffect
|
||||
else
|
||||
{
|
||||
LOGGER.warning("Player " + effector + " called unknown skill " + _skill + " triggered by " + skill + " CallSkill.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -100,7 +103,21 @@ public class CallSkill extends AbstractEffect
|
||||
return;
|
||||
}
|
||||
|
||||
SkillCaster.triggerCast(effector, effected, triggerSkill);
|
||||
final int hitTime = triggerSkill.getHitTime();
|
||||
if (hitTime > 0)
|
||||
{
|
||||
if (effector.isSkillDisabled(triggerSkill))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
effector.broadcastPacket(new MagicSkillUse(effector, effected, triggerSkill.getDisplayId(), triggerSkill.getLevel(), hitTime, 0));
|
||||
ThreadPool.schedule(() -> SkillCaster.triggerCast(effector, effected, triggerSkill), hitTime);
|
||||
}
|
||||
else
|
||||
{
|
||||
SkillCaster.triggerCast(effector, effected, triggerSkill);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
import org.l2jmobius.gameserver.model.stats.Stat;
|
||||
|
||||
/**
|
||||
* @author fruit
|
||||
*/
|
||||
public class IgnoreReduceDamage extends AbstractStatEffect
|
||||
{
|
||||
public IgnoreReduceDamage(StatSet params)
|
||||
{
|
||||
super(params, Stat.IGNORE_REDUCE_DAMAGE);
|
||||
}
|
||||
}
|
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.StatModifierType;
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
|
||||
@@ -25,6 +26,7 @@ import org.l2jmobius.gameserver.model.events.listeners.FunctionEventListener;
|
||||
import org.l2jmobius.gameserver.model.events.returns.DamageReturn;
|
||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||
import org.l2jmobius.gameserver.model.stats.Stat;
|
||||
|
||||
/**
|
||||
* @author Sdw
|
||||
@@ -32,10 +34,12 @@ import org.l2jmobius.gameserver.model.skill.Skill;
|
||||
public class ReduceDamage extends AbstractEffect
|
||||
{
|
||||
private final double _amount;
|
||||
private final StatModifierType _mode;
|
||||
|
||||
public ReduceDamage(StatSet params)
|
||||
{
|
||||
_amount = params.getDouble("amount");
|
||||
_mode = params.getEnum("mode", StatModifierType.class, StatModifierType.DIFF);
|
||||
}
|
||||
|
||||
private DamageReturn onDamageReceivedEvent(OnCreatureDamageReceived event)
|
||||
@@ -46,7 +50,15 @@ public class ReduceDamage extends AbstractEffect
|
||||
return null;
|
||||
}
|
||||
|
||||
final double newDamage = event.getDamage() * (_amount / 100);
|
||||
final double newDamage;
|
||||
if (_mode == StatModifierType.PER)
|
||||
{
|
||||
newDamage = event.getDamage() - (event.getDamage() * (_amount / 100));
|
||||
}
|
||||
else // DIFF
|
||||
{
|
||||
newDamage = event.getDamage() - Math.max((_amount - event.getAttacker().getStat().getAdd(Stat.IGNORE_REDUCE_DAMAGE)), 0.0);
|
||||
}
|
||||
|
||||
return new DamageReturn(false, true, false, newDamage);
|
||||
}
|
||||
|
@@ -16,14 +16,21 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.commons.threads.ThreadPool;
|
||||
import org.l2jmobius.gameserver.enums.StatModifierType;
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
|
||||
import org.l2jmobius.gameserver.model.effects.EffectType;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
|
||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.InventoryUpdate;
|
||||
|
||||
/**
|
||||
* @author NviX
|
||||
@@ -39,6 +46,12 @@ public class RestoreSymbolSeal extends AbstractEffect
|
||||
_mode = params.getEnum("mode", StatModifierType.class, StatModifierType.PER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EffectType getEffectType()
|
||||
{
|
||||
return EffectType.RESTORE_SYMBOL_SEAL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInstant()
|
||||
{
|
||||
@@ -77,6 +90,33 @@ public class RestoreSymbolSeal extends AbstractEffect
|
||||
player.updateSymbolSealSkills();
|
||||
player.sendSkillList();
|
||||
player.broadcastUserInfo();
|
||||
|
||||
// Send item list to update Dye Powder with red icon in inventory.
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
final List<Item> items = new LinkedList<>();
|
||||
ITEMS: for (Item i : effected.getActingPlayer().getInventory().getItems())
|
||||
{
|
||||
if (i.getTemplate().hasSkills())
|
||||
{
|
||||
for (ItemSkillHolder s : i.getTemplate().getAllSkills())
|
||||
{
|
||||
if (s.getSkill().hasEffectType(EffectType.RESTORE_SYMBOL_SEAL))
|
||||
{
|
||||
items.add(i);
|
||||
continue ITEMS;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!items.isEmpty())
|
||||
{
|
||||
final InventoryUpdate iu = new InventoryUpdate();
|
||||
iu.addItems(items);
|
||||
effected.getActingPlayer().sendInventoryUpdate(iu);
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -210,6 +210,11 @@ public class TriggerSkillByAttack extends AbstractEffect
|
||||
else
|
||||
{
|
||||
triggerSkill = SkillData.getInstance().getSkill(_skill.getSkillId(), Math.min(_skillLevelScaleTo, buffInfo.getSkill().getLevel() + 1));
|
||||
|
||||
if (event.getAttacker().isSkillDisabled(buffInfo.getSkill()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ((buffInfo == null) || (buffInfo.getSkill().getLevel() < triggerSkill.getLevel()) || _renewDuration)
|
||||
|
@@ -124,6 +124,15 @@ public class TriggerSkillBySkill extends AbstractEffect
|
||||
if (buffInfo != null)
|
||||
{
|
||||
triggerSkill = SkillData.getInstance().getSkill(_skill.getSkillId(), Math.min(_skillLevelScaleTo, buffInfo.getSkill().getLevel() + 1));
|
||||
|
||||
if (event.getCaster().isSkillDisabled(buffInfo.getSkill()))
|
||||
{
|
||||
if ((_replace) && (buffInfo.getSkill().getLevel() == _skillLevelScaleTo))
|
||||
{
|
||||
((Creature) target).stopSkillEffects(SkillFinishType.SILENT, triggerSkill.getId());
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@@ -17,7 +17,13 @@
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||
import org.l2jmobius.gameserver.model.stats.Stat;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.InventoryUpdate;
|
||||
|
||||
/**
|
||||
* @author Sero
|
||||
@@ -28,4 +34,46 @@ public class WeaponBonusMAtk extends AbstractStatAddEffect
|
||||
{
|
||||
super(params, Stat.WEAPON_BONUS_MAGIC_ATTACK);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart(Creature effector, Creature effected, Skill skill, Item item)
|
||||
{
|
||||
final Player player = effected.getActingPlayer();
|
||||
if (player == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Item weapon = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
|
||||
if (weapon == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final InventoryUpdate iu = new InventoryUpdate();
|
||||
iu.addModifiedItem(weapon);
|
||||
player.sendInventoryUpdate(iu);
|
||||
player.broadcastUserInfo();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExit(Creature effector, Creature effected, Skill skill)
|
||||
{
|
||||
final Player player = effected.getActingPlayer();
|
||||
if (player == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Item weapon = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
|
||||
if (weapon == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final InventoryUpdate iu = new InventoryUpdate();
|
||||
iu.addModifiedItem(weapon);
|
||||
player.sendInventoryUpdate(iu);
|
||||
player.broadcastUserInfo();
|
||||
}
|
||||
}
|
||||
|
@@ -17,7 +17,13 @@
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||
import org.l2jmobius.gameserver.model.stats.Stat;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.InventoryUpdate;
|
||||
|
||||
/**
|
||||
* @author Sero
|
||||
@@ -28,4 +34,46 @@ public class WeaponBonusPAtk extends AbstractStatAddEffect
|
||||
{
|
||||
super(params, Stat.WEAPON_BONUS_PHYSICAL_ATTACK);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart(Creature effector, Creature effected, Skill skill, Item item)
|
||||
{
|
||||
final Player player = effected.getActingPlayer();
|
||||
if (player == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Item weapon = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
|
||||
if (weapon == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final InventoryUpdate iu = new InventoryUpdate();
|
||||
iu.addModifiedItem(weapon);
|
||||
player.sendInventoryUpdate(iu);
|
||||
player.broadcastUserInfo();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExit(Creature effector, Creature effected, Skill skill)
|
||||
{
|
||||
final Player player = effected.getActingPlayer();
|
||||
if (player == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Item weapon = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
|
||||
if (weapon == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final InventoryUpdate iu = new InventoryUpdate();
|
||||
iu.addModifiedItem(weapon);
|
||||
player.sendInventoryUpdate(iu);
|
||||
player.broadcastUserInfo();
|
||||
}
|
||||
}
|
@@ -16,39 +16,61 @@
|
||||
*/
|
||||
package handlers.playeractions;
|
||||
|
||||
import org.l2jmobius.gameserver.ai.CtrlIntention;
|
||||
import org.l2jmobius.gameserver.handler.IPlayerActionHandler;
|
||||
import org.l2jmobius.gameserver.model.ActionDataHolder;
|
||||
import org.l2jmobius.gameserver.model.WorldObject;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.Pet;
|
||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
|
||||
/**
|
||||
* Pet attack player action handler.
|
||||
* @author Nik
|
||||
* @author Mobius
|
||||
*/
|
||||
public class PetAttack implements IPlayerActionHandler
|
||||
{
|
||||
@Override
|
||||
public void useAction(Player player, ActionDataHolder data, boolean ctrlPressed, boolean shiftPressed)
|
||||
{
|
||||
if ((player.getPet() == null) || !player.getPet().isPet())
|
||||
final Pet pet = player.getPet();
|
||||
if ((pet == null) || !pet.isPet())
|
||||
{
|
||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_A_PET);
|
||||
return;
|
||||
}
|
||||
|
||||
final Pet pet = player.getPet();
|
||||
if (pet.isUncontrollable())
|
||||
{
|
||||
player.sendPacket(SystemMessageId.WHEN_YOUR_PET_S_HUNGER_GAUGE_IS_AT_0_YOU_CANNOT_USE_YOUR_PET);
|
||||
return;
|
||||
}
|
||||
else if (pet.isBetrayed())
|
||||
|
||||
if (pet.isBetrayed())
|
||||
{
|
||||
player.sendPacket(SystemMessageId.YOUR_PET_SERVITOR_IS_UNRESPONSIVE_AND_WILL_NOT_OBEY_ANY_ORDERS);
|
||||
return;
|
||||
}
|
||||
else if (pet.canAttack(player.getTarget(), ctrlPressed))
|
||||
|
||||
final WorldObject target = player.getTarget();
|
||||
if (target == null)
|
||||
{
|
||||
pet.doAttack(player.getTarget());
|
||||
return;
|
||||
}
|
||||
|
||||
if (player.calculateDistance3D(target) > 3000)
|
||||
{
|
||||
pet.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, player);
|
||||
}
|
||||
else if (pet.canAttack(target, ctrlPressed))
|
||||
{
|
||||
pet.doAttack(target);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPetAction()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -52,4 +52,10 @@ public class PetHold implements IPlayerActionHandler
|
||||
((SummonAI) pet.getAI()).notifyFollowStatusChange();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPetAction()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -53,4 +53,10 @@ public class PetMove implements IPlayerActionHandler
|
||||
pet.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, player.getTarget().getLocation());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPetAction()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -77,4 +77,10 @@ public class PetSkillUse implements IPlayerActionHandler
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPetAction()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -51,4 +51,10 @@ public class PetStop implements IPlayerActionHandler
|
||||
pet.cancelAction();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPetAction()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -16,34 +16,52 @@
|
||||
*/
|
||||
package handlers.playeractions;
|
||||
|
||||
import org.l2jmobius.gameserver.ai.CtrlIntention;
|
||||
import org.l2jmobius.gameserver.handler.IPlayerActionHandler;
|
||||
import org.l2jmobius.gameserver.model.ActionDataHolder;
|
||||
import org.l2jmobius.gameserver.model.WorldObject;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.actor.Summon;
|
||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
|
||||
/**
|
||||
* Servitor Attack player action handler.
|
||||
* @author St3eT
|
||||
* @author Mobius
|
||||
*/
|
||||
public class ServitorAttack implements IPlayerActionHandler
|
||||
{
|
||||
@Override
|
||||
public void useAction(Player player, ActionDataHolder data, boolean ctrlPressed, boolean shiftPressed)
|
||||
{
|
||||
if (player.hasServitors())
|
||||
{
|
||||
for (Summon summon : player.getServitors().values())
|
||||
{
|
||||
if (summon.canAttack(player.getTarget(), ctrlPressed))
|
||||
{
|
||||
summon.doAttack(player.getTarget());
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
if (!player.hasServitors())
|
||||
{
|
||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_A_SERVITOR);
|
||||
return;
|
||||
}
|
||||
|
||||
final WorldObject target = player.getTarget();
|
||||
if (target == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final boolean targetOutOfRange = player.calculateDistance3D(target) > 3000;
|
||||
for (Summon summon : player.getServitors().values())
|
||||
{
|
||||
if (targetOutOfRange)
|
||||
{
|
||||
summon.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, player);
|
||||
}
|
||||
else if (summon.canAttack(target, ctrlPressed))
|
||||
{
|
||||
summon.doAttack(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPetAction()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -48,4 +48,10 @@ public class ServitorHold implements IPlayerActionHandler
|
||||
((SummonAI) s.getAI()).notifyFollowStatusChange();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPetAction()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -68,4 +68,10 @@ public class ServitorMode implements IPlayerActionHandler
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPetAction()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -56,4 +56,10 @@ public class ServitorMove implements IPlayerActionHandler
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPetAction()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -62,4 +62,10 @@ public class ServitorSkillUse implements IPlayerActionHandler
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPetAction()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -47,4 +47,10 @@ public class ServitorStop implements IPlayerActionHandler
|
||||
s.cancelAction();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPetAction()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -62,4 +62,10 @@ public class UnsummonPet implements IPlayerActionHandler
|
||||
pet.unSummon(player);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPetAction()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -69,4 +69,10 @@ public class UnsummonServitor implements IPlayerActionHandler
|
||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_A_SERVITOR);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPetAction()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package handlers.skillconditionhandlers;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
import org.l2jmobius.gameserver.model.WorldObject;
|
||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||
import org.l2jmobius.gameserver.model.skill.ISkillCondition;
|
||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||
|
||||
/**
|
||||
* @author CostyKiller
|
||||
*/
|
||||
public class CanUseSymbolSealIncreaseItemSkillCondition implements ISkillCondition
|
||||
{
|
||||
private final int _amount;
|
||||
|
||||
public CanUseSymbolSealIncreaseItemSkillCondition(StatSet params)
|
||||
{
|
||||
_amount = params.getInt("amount", 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUse(Creature caster, Skill skill, WorldObject target)
|
||||
{
|
||||
return caster.isPlayer() && ((caster.getActingPlayer().getSymbolSealPoints() + ((Config.MAX_SYMBOL_SEAL_POINTS * _amount) / 100)) <= Config.MAX_SYMBOL_SEAL_POINTS);
|
||||
}
|
||||
}
|
@@ -39,10 +39,11 @@ public class OpSkillAcquireSkillCondition implements ISkillCondition
|
||||
@Override
|
||||
public boolean canUse(Creature caster, Skill skill, WorldObject target)
|
||||
{
|
||||
if (!target.isCreature())
|
||||
if ((target == null) || !target.isCreature())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
final int skillLevel = ((Creature) target).getSkillLevel(_skillId);
|
||||
return _hasLearned ? skillLevel != 0 : skillLevel == 0;
|
||||
}
|
||||
|
@@ -67,7 +67,7 @@ public class PartyPledge implements IAffectScopeHandler
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((p != player) && (p.getClanId() != clanId) && ((party == null) || (party != p.getParty())))
|
||||
if ((p != player) && ((clanId == 0) || (p.getClanId() != clanId)) && ((party == null) || (party != p.getParty())))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@@ -24,6 +24,7 @@ import org.l2jmobius.gameserver.model.actor.Attackable;
|
||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.FriendlyNpc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.Monster;
|
||||
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -46,10 +47,11 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
{
|
||||
// NPCs
|
||||
private static final int KAIN_VAN_HALTER = 31639;
|
||||
private static final int VAN_HALTER = 33999;
|
||||
private static final int FERIN = 34001;
|
||||
private static final int GRAIL = 33996;
|
||||
private static final int MYSTERIOUS_WIZARD = 33980;
|
||||
// Helper NPCs
|
||||
private static final int HELPER_VAN_HALTER = 33999;
|
||||
private static final int HELPER_FERIN = 34001;
|
||||
// Misc
|
||||
private static final int DOOR_2 = 17230102;
|
||||
private static final int DOOR_3 = 17230103;
|
||||
@@ -66,7 +68,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
addStartNpc(KAIN_VAN_HALTER);
|
||||
addFirstTalkId(KAIN_VAN_HALTER, GRAIL, MYSTERIOUS_WIZARD);
|
||||
addTalkId(KAIN_VAN_HALTER, GRAIL, MYSTERIOUS_WIZARD);
|
||||
addCreatureSeeId(FERIN, VAN_HALTER);
|
||||
addCreatureSeeId(HELPER_FERIN, HELPER_VAN_HALTER);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -145,12 +147,12 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
{
|
||||
return null;
|
||||
}
|
||||
final Npc valHalter = world.getNpc(VAN_HALTER);
|
||||
if (valHalter != null)
|
||||
final FriendlyNpc vanHalter = (FriendlyNpc) world.getNpc(HELPER_VAN_HALTER);
|
||||
if (vanHalter != null)
|
||||
{
|
||||
valHalter.deleteMe(); // probably needs another npc id for initial room
|
||||
vanHalter.deleteMe(); // probably needs another npc id for initial room
|
||||
}
|
||||
final Npc ferin = world.getNpc(FERIN);
|
||||
final FriendlyNpc ferin = (FriendlyNpc) world.getNpc(HELPER_FERIN);
|
||||
if (ferin != null)
|
||||
{
|
||||
ferin.deleteMe(); // probably needs another npc id for initial room
|
||||
@@ -190,6 +192,8 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
case "CHECK_STATUS":
|
||||
{
|
||||
final Instance world = player.getInstanceWorld();
|
||||
final FriendlyNpc ferin = (FriendlyNpc) world.getNpc(HELPER_FERIN);
|
||||
final FriendlyNpc vanHalter = (FriendlyNpc) world.getNpc(HELPER_VAN_HALTER);
|
||||
if (!isInInstance(world))
|
||||
{
|
||||
return null;
|
||||
@@ -200,8 +204,8 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
{
|
||||
if (world.getAliveNpcs(Monster.class).isEmpty())
|
||||
{
|
||||
startQuestTimer("SEY2", 14000, world.getNpc(FERIN), player);
|
||||
startQuestTimer("SEY_KAIN", 24000, world.getNpc(VAN_HALTER), player);
|
||||
startQuestTimer("SEY2", 14000, ferin, player);
|
||||
startQuestTimer("SEY_KAIN", 24000, vanHalter, player);
|
||||
startQuestTimer("OPEN_DOOR1", 5000, npc, player);
|
||||
}
|
||||
startQuestTimer("CHECK_STATUS", 7000, npc, player);
|
||||
@@ -221,7 +225,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
{
|
||||
if (world.getAliveNpcs(Monster.class).isEmpty())
|
||||
{
|
||||
startQuestTimer("SEY3", 8000, world.getNpc(FERIN), player);
|
||||
startQuestTimer("SEY3", 8000, ferin, player);
|
||||
startQuestTimer("OPEN_DOOR2", 5000, npc, player);
|
||||
}
|
||||
startQuestTimer("CHECK_STATUS", 7000, npc, player);
|
||||
@@ -234,7 +238,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
world.setStatus(4);
|
||||
world.spawnGroup("wof_room3_2");
|
||||
world.openCloseDoor(DOOR_3, false);
|
||||
startQuestTimer("SEY_KAIN_1", 5000, world.getNpc(VAN_HALTER), player);
|
||||
startQuestTimer("SEY_KAIN_1", 5000, vanHalter, player);
|
||||
}
|
||||
startQuestTimer("CHECK_STATUS", 7000, npc, player);
|
||||
break;
|
||||
@@ -245,8 +249,8 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
{
|
||||
world.setStatus(5);
|
||||
world.spawnGroup("wof_room4");
|
||||
startQuestTimer("SEY_KAIN_2", 3000, world.getNpc(VAN_HALTER), player);
|
||||
startQuestTimer("SEY4", 7000, world.getNpc(FERIN), player);
|
||||
startQuestTimer("SEY_KAIN_2", 3000, vanHalter, player);
|
||||
startQuestTimer("SEY4", 7000, ferin, player);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -304,7 +308,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
return null;
|
||||
}
|
||||
cancelQuestTimer("ATTACK1", npc, player);
|
||||
startQuestTimer("ATTACK2", 200, world.getNpc(VAN_HALTER), player, true);
|
||||
startQuestTimer("ATTACK2", 200, world.getNpc(HELPER_VAN_HALTER), player, true);
|
||||
world.setStatus(3);
|
||||
world.spawnGroup("wof_room3");
|
||||
world.openCloseDoor(DOOR_3, true);
|
||||
@@ -321,7 +325,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
}
|
||||
case "SEY2":
|
||||
{
|
||||
if ((npc != null) && (npc.getId() == FERIN))
|
||||
if ((npc != null) && (npc.getId() == HELPER_FERIN))
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.YOU_CAN_T_DIE_HERE_I_DIDN_T_LEARN_RESURRECT_YET));
|
||||
player.sendPacket(new PlaySound(3, "Npcdialog1.apple_quest_4", 0, 0, 0, 0, 0));
|
||||
@@ -330,7 +334,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
}
|
||||
case "SEY_KAIN":
|
||||
{
|
||||
if ((npc != null) && (npc.getId() == VAN_HALTER))
|
||||
if ((npc != null) && (npc.getId() == HELPER_VAN_HALTER))
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.GISELLE_WAS_SUCH_A_SWEET_CHILD));
|
||||
player.sendPacket(new PlaySound(3, "Npcdialog1.holter_quest_1", 0, 0, 0, 0, 0));
|
||||
@@ -340,7 +344,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
}
|
||||
case "SEY3":
|
||||
{
|
||||
if ((npc != null) && (npc.getId() == FERIN))
|
||||
if ((npc != null) && (npc.getId() == HELPER_FERIN))
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.DO_YOU_THINK_I_LL_GROW_TALLER_IF_I_EAT_LOTS_AND_LOTS));
|
||||
player.sendPacket(new PlaySound(3, "Npcdialog1.apple_quest_6", 0, 0, 0, 0, 0));
|
||||
@@ -349,7 +353,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
}
|
||||
case "SEY_KAIN_1":
|
||||
{
|
||||
if ((npc != null) && (npc.getId() == VAN_HALTER))
|
||||
if ((npc != null) && (npc.getId() == HELPER_VAN_HALTER))
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.SUCH_MONSTERS_IN_A_PLACE_LIKE_THIS_UNBELIEVABLE));
|
||||
}
|
||||
@@ -357,7 +361,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
}
|
||||
case "SEY_KAIN_2":
|
||||
{
|
||||
if ((npc != null) && (npc.getId() == VAN_HALTER))
|
||||
if ((npc != null) && (npc.getId() == HELPER_VAN_HALTER))
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.THAT_S_THE_MONSTER_THAT_ATTACKED_FAERON_YOU_RE_OUTMATCHED_HERE_GO_AHEAD_I_LL_CATCH_UP));
|
||||
player.sendPacket(new PlaySound(3, "Npcdialog1.holter_quest_6", 0, 0, 0, 0, 0));
|
||||
@@ -367,7 +371,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
}
|
||||
case "SEY4":
|
||||
{
|
||||
if ((npc != null) && (npc.getId() == FERIN))
|
||||
if ((npc != null) && (npc.getId() == HELPER_FERIN))
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.GO_NOW_KAIN_CAN_HANDLE_THIS));
|
||||
npc.setScriptValue(1);
|
||||
@@ -377,7 +381,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
}
|
||||
case "SEY_KAIN_3":
|
||||
{
|
||||
if ((npc != null) && (npc.getId() == VAN_HALTER))
|
||||
if ((npc != null) && (npc.getId() == HELPER_VAN_HALTER))
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.LEAVE_THIS_TO_ME_GO));
|
||||
npc.setScriptValue(1);
|
||||
@@ -387,7 +391,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
}
|
||||
case "REST":
|
||||
{
|
||||
if ((npc != null) && (npc.getId() == FERIN))
|
||||
if ((npc != null) && (npc.getId() == HELPER_FERIN))
|
||||
{
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, player);
|
||||
}
|
||||
@@ -508,7 +512,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
{
|
||||
switch (npc.getId())
|
||||
{
|
||||
case FERIN:
|
||||
case HELPER_FERIN:
|
||||
{
|
||||
if (creature.isPlayer() && !creature.isDead() && npc.isScriptValue(0))
|
||||
{
|
||||
@@ -516,7 +520,7 @@ public class ChamberOfProphecies extends AbstractInstance
|
||||
}
|
||||
break;
|
||||
}
|
||||
case VAN_HALTER:
|
||||
case HELPER_VAN_HALTER:
|
||||
{
|
||||
if (creature.isPlayer() && !creature.isDead() && world.isStatus(0))
|
||||
{
|
||||
|
@@ -177,7 +177,14 @@ public class Q00933_TombRaiders extends Quest
|
||||
final Party party = killer.getParty();
|
||||
if (party != null)
|
||||
{
|
||||
party.getMembers().forEach(p -> processKill(npc, p));
|
||||
for (Player member : party.getMembers())
|
||||
{
|
||||
final QuestState qs = getQuestState(member, false);
|
||||
if (qs != null)
|
||||
{
|
||||
processKill(npc, member);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@@ -1,4 +1,6 @@
|
||||
<html><body>Verdure Elder Elikia:<br>
|
||||
Have you brought me the message from Leona Blackbird?
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10885_SaviorsPathDiscovery 34057-03.html">"Yes, here it is."</Button>
|
||||
Greetings! I've been expecting you for a while.<br>
|
||||
Leona asked me to tell you something.<br>
|
||||
I hope you are ready to hear me out and help.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10885_SaviorsPathDiscovery 34057-02.htm">"What has Leona asked you to tell?"</Button>
|
||||
</body></html>
|
@@ -0,0 +1,6 @@
|
||||
<html><body>Verdure Elder Elikia:<br>
|
||||
I see you are ready. Now I'm going to tell you what Leona has told me.<br>
|
||||
In the last combat with Etis van Etina, Leona was badly wounded, so she had to train to recover her strength. Unfortunately, she had no time to complete the trainings because she received a message. It said about a dungeon of Atelia Fortress. Something connected to Etis van Etina was found there. That place was very odd and was called <font color="LEVEL">Atelia Refinery</font>.<br>
|
||||
Leona wanted to meet you personally, but there was an urgent business, so she asked me to see you and explain the situation. My mission is connected with that place.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10885_SaviorsPathDiscovery 34057-03.htm">Ask about Atelia Refinery</Button>
|
||||
</body></html>
|
@@ -1,3 +0,0 @@
|
||||
<html><body>Verdure Elder Elikia:<br>
|
||||
I don't see any message from Leona Blackbird, make sure you bring that to me.
|
||||
</body></html>
|
@@ -0,0 +1,6 @@
|
||||
<html><body>Verdure Elder Elikia:<br>
|
||||
We're assuming by the name that it's where Atelia is refined.<br>
|
||||
It's located at the underground of Atelia Fortress, so we didn't know about it until now.<br>
|
||||
I think Atelia refined from there is sent to the great temple where Etis van Etina is.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10885_SaviorsPathDiscovery 34057-04.html">"What has happened so far?"</Button>
|
||||
</body></html>
|
@@ -1,3 +0,0 @@
|
||||
<html><body>Verdure Elder Elikia:<br>
|
||||
Great! You have brought it, now let me read it.<br>
|
||||
</body></html>
|
@@ -1,4 +0,0 @@
|
||||
<html><body>Verdure Elder Elikia:<br>
|
||||
I've read the message from Leona Blackbird you should go see her to tell you what you have to do.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10885_SaviorsPathDiscovery 34057-05.html">"Ok, I'll go."</Button>
|
||||
</body></html>
|
@@ -0,0 +1,6 @@
|
||||
<html><body>Verdure Elder Elikia:<br>
|
||||
Leona was lost in despair for some time but she finally rose again and started investigating the Atelia Refinery.<br>
|
||||
But our strength still isn't enough, so we're asking for your help once again.<br>
|
||||
Leona will be at the entrance of the Atelia Refinery. You'll find it if you leave camp and follow the passage of Dimensional Energy to the west.<br>
|
||||
Leona will fill you in with more details.
|
||||
</body></html>
|
@@ -1,3 +0,0 @@
|
||||
<html><body>Verdure Elder Elikia:<br>
|
||||
Leona Blackbird is waiting for you at Atelia Refinery entrance.
|
||||
</body></html>
|
@@ -1,5 +0,0 @@
|
||||
<html><body>Message:<br>
|
||||
You received a message from Leona Blackbird, this means you can start Savior's Path quests.<br>
|
||||
To learn more, go to Blackbird Campsite and talk to Elikia.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10885_SaviorsPathDiscovery closeMessage">"Close message."</Button>
|
||||
</body></html>
|
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
package quests.Q10885_SaviorsPathDiscovery;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.Movie;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
@@ -58,20 +59,27 @@ public class Q10885_SaviorsPathDiscovery extends Quest
|
||||
String htmltext = null;
|
||||
switch (event)
|
||||
{
|
||||
case "34057-03.html":
|
||||
case "34057-02.htm":
|
||||
{
|
||||
qs.startQuest();
|
||||
htmltext = event;
|
||||
break;
|
||||
}
|
||||
case "34057-03.htm":
|
||||
{
|
||||
if (qs.isCond(1))
|
||||
{
|
||||
takeItems(player, -1, LEONA_BLACKBIRDS_MESSAGE);
|
||||
qs.setCond(2);
|
||||
}
|
||||
htmltext = event;
|
||||
break;
|
||||
}
|
||||
case "34057-05.html":
|
||||
case "34057-04.html":
|
||||
{
|
||||
if (qs.isCond(2))
|
||||
{
|
||||
giveItems(player, LEONA_BLACKBIRDS_MESSAGE, 1, true);
|
||||
playMovie(player, Movie.EP5_ASTATINE_QST_START);
|
||||
qs.setCond(3);
|
||||
}
|
||||
htmltext = event;
|
||||
@@ -83,6 +91,7 @@ public class Q10885_SaviorsPathDiscovery extends Quest
|
||||
{
|
||||
if ((player.getLevel() >= MIN_LEVEL))
|
||||
{
|
||||
takeItems(player, -1, LEONA_BLACKBIRDS_MESSAGE);
|
||||
addExpAndSp(player, 906387492, 906387);
|
||||
qs.exitQuest(false, true);
|
||||
htmltext = event;
|
||||
@@ -137,7 +146,11 @@ public class Q10885_SaviorsPathDiscovery extends Quest
|
||||
}
|
||||
else if (qs.isCond(2))
|
||||
{
|
||||
htmltext = "34057-04.htm";
|
||||
htmltext = "34057-03.htm";
|
||||
}
|
||||
else if (qs.isCond(3))
|
||||
{
|
||||
htmltext = "34057-04.html";
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
<html><body>Blackbird Clan Lord Leona Blackbird:<br>
|
||||
Yes. Go speak to <font color="LEVEL">Devianne</font>.
|
||||
Yes. Go speak to <font color="LEVEL">Devianne</font>.<br>
|
||||
Devianne will tell you how to get to the Atelia Refinery and what you must do there.<br>
|
||||
</body></html>
|
@@ -621,7 +621,7 @@ public class Q11025_PathOfDestinyProving extends Quest
|
||||
holder.add(new NpcLogListHolder(NpcStringId.DEFEAT_SKELETONS_3.getId(), true, qs.getInt(KILL_COUNT_VAR)));
|
||||
return holder;
|
||||
}
|
||||
else if (qs.isCond(11))
|
||||
else if (qs.isCond(12))
|
||||
{
|
||||
final Set<NpcLogListHolder> holder = new HashSet<>();
|
||||
holder.add(new NpcLogListHolder(NpcStringId.INVESTIGATE_THE_SURROUNDINGS.getId(), true, qs.getInt(KILL_COUNT_VAR2)));
|
||||
|
@@ -315,7 +315,6 @@ public class Q11026_PathOfDestinyConviction extends Quest
|
||||
{
|
||||
player.teleToLocation(TRAINING_GROUNDS_TELEPORT1);
|
||||
}
|
||||
htmltext = event;
|
||||
break;
|
||||
}
|
||||
case "teleport2":
|
||||
@@ -324,7 +323,6 @@ public class Q11026_PathOfDestinyConviction extends Quest
|
||||
{
|
||||
player.teleToLocation(TRAINING_GROUNDS_TELEPORT2);
|
||||
}
|
||||
htmltext = event;
|
||||
break;
|
||||
}
|
||||
case "teleport3":
|
||||
@@ -333,7 +331,6 @@ public class Q11026_PathOfDestinyConviction extends Quest
|
||||
{
|
||||
player.teleToLocation(TRAINING_GROUNDS_TELEPORT3);
|
||||
}
|
||||
htmltext = event;
|
||||
break;
|
||||
}
|
||||
case "teleport4":
|
||||
@@ -342,7 +339,6 @@ public class Q11026_PathOfDestinyConviction extends Quest
|
||||
{
|
||||
player.teleToLocation(TRAINING_GROUNDS_TELEPORT4);
|
||||
}
|
||||
htmltext = event;
|
||||
break;
|
||||
}
|
||||
case "teleport5":
|
||||
@@ -351,10 +347,8 @@ public class Q11026_PathOfDestinyConviction extends Quest
|
||||
{
|
||||
player.teleToLocation(TRAINING_GROUNDS_TELEPORT5);
|
||||
}
|
||||
htmltext = event;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
@@ -3,7 +3,7 @@
|
||||
<font color="LEVEL">When the god's voice will no longer be heard.</font><br>
|
||||
<font color="LEVEL">A red river flows...</font><br>
|
||||
<font color="LEVEL">Hard frost upon the earth... And one of half-noble blood, descending with the winds to become the prophesied one.</font><br>
|
||||
<font color="LEVEL">Your lonely, solitary journey has begun. A small child in the middle of a blocked road appears. When joined by one of nobility, the path will open to the Grail.</center><br>
|
||||
<font color="LEVEL">Your lonely, solitary journey has begun. A small child in the middle of a blocked road appears. When joined by one of nobility, the path will open to the Grail.</font></center><br>
|
||||
So it wasn't a coincidence that you left on your journey.<br>
|
||||
<Button ALIGN=LEFT ICON="Normal" action="bypass -h Quest Q11027_PathOfDestinyOvercome 33932-05.html">"What do you mean?"</Button>
|
||||
</body></html>
|
Reference in New Issue
Block a user