From 2823174ded78a3345a405f487a900409553f7ef0 Mon Sep 17 00:00:00 2001
From: MobiusDev <8391001+MobiusDevelopment@users.noreply.github.com>
Date: Tue, 23 Aug 2016 21:42:58 +0000
Subject: [PATCH] Handy's Block Checker Event related improvements.
---
.../scripts/handlers/EffectMasterHandler.java | 1 +
.../handlers/effecthandlers/FlipBlock.java | 76 +++++++++++++++++
.../game/data/stats/skills/05800-05899.xml | 12 ++-
.../gameserver/enums/InstanceType.java | 1 +
.../gameserver/enums/NpcInfoType.java | 2 +-
.../gameserver/model/skills/Skill.java | 85 +++++--------------
.../network/serverpackets/ExPetInfo.java | 4 +-
.../network/serverpackets/NpcInfo.java | 7 +-
.../network/serverpackets/SummonInfo.java | 4 +-
9 files changed, 117 insertions(+), 75 deletions(-)
create mode 100644 L2J_Mobius_Underground/dist/game/data/scripts/handlers/effecthandlers/FlipBlock.java
diff --git a/L2J_Mobius_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java
index b51ada8bb8..076f7a68d6 100644
--- a/L2J_Mobius_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -130,6 +130,7 @@ public final class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Fear", Fear::new);
EffectHandler.getInstance().registerHandler("Feed", Feed::new);
EffectHandler.getInstance().registerHandler("Flag", Flag::new);
+ EffectHandler.getInstance().registerHandler("FlipBlock", FlipBlock::new);
EffectHandler.getInstance().registerHandler("FlyMove", FlyMove::new);
EffectHandler.getInstance().registerHandler("FocusEnergy", FocusEnergy::new);
EffectHandler.getInstance().registerHandler("FocusMomentum", FocusMomentum::new);
diff --git a/L2J_Mobius_Underground/dist/game/data/scripts/handlers/effecthandlers/FlipBlock.java b/L2J_Mobius_Underground/dist/game/data/scripts/handlers/effecthandlers/FlipBlock.java
new file mode 100644
index 0000000000..4713cb4116
--- /dev/null
+++ b/L2J_Mobius_Underground/dist/game/data/scripts/handlers/effecthandlers/FlipBlock.java
@@ -0,0 +1,76 @@
+/*
+ * 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 .
+ */
+package handlers.effecthandlers;
+
+import com.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager;
+import com.l2jmobius.gameserver.model.ArenaParticipantsHolder;
+import com.l2jmobius.gameserver.model.StatsSet;
+import com.l2jmobius.gameserver.model.actor.L2Character;
+import com.l2jmobius.gameserver.model.actor.instance.L2BlockInstance;
+import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
+import com.l2jmobius.gameserver.model.skills.Skill;
+
+/**
+ * Flip Block effect implementation.
+ * @author Mobius
+ */
+public final class FlipBlock extends AbstractEffect
+{
+ public FlipBlock(StatsSet params)
+ {
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(L2Character effector, L2Character effected, Skill skill, L2ItemInstance item)
+ {
+ final L2BlockInstance block = effected instanceof L2BlockInstance ? (L2BlockInstance) effected : null;
+ final L2PcInstance player = effector.isPlayer() ? (L2PcInstance) effector : null;
+ if ((block == null) || (player == null))
+ {
+ return;
+ }
+
+ final int arena = player.getBlockCheckerArena();
+ if (arena != -1)
+ {
+ final ArenaParticipantsHolder holder = HandysBlockCheckerManager.getInstance().getHolder(arena);
+ if (holder == null)
+ {
+ return;
+ }
+
+ final int team = holder.getPlayerTeam(player);
+ final int color = block.getColorEffect();
+ if ((team == 0) && (color == 0x00))
+ {
+ block.changeColor(player, holder, team);
+ }
+ else if ((team == 1) && (color == 0x53))
+ {
+ block.changeColor(player, holder, team);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Underground/dist/game/data/stats/skills/05800-05899.xml b/L2J_Mobius_Underground/dist/game/data/stats/skills/05800-05899.xml
index 78803bc367..6fee4f03d8 100644
--- a/L2J_Mobius_Underground/dist/game/data/stats/skills/05800-05899.xml
+++ b/L2J_Mobius_Underground/dist/game/data/stats/skills/05800-05899.xml
@@ -1252,6 +1252,7 @@
40
+ -1
400
1000
icon.skill_transform_s_attack
@@ -1260,12 +1261,16 @@
2000
NONE
-5
- OTHERS
+ ENEMY
SINGLE
+
+
+
40
+ -1
400
1000
icon.skill_transform_s_attack
@@ -1274,8 +1279,11 @@
2000
NONE
-5
- OTHERS
+ ENEMY
SINGLE
+
+
+
3
diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/enums/InstanceType.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/enums/InstanceType.java
index 84d862402e..677acb99d9 100644
--- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/enums/InstanceType.java
+++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/enums/InstanceType.java
@@ -44,6 +44,7 @@ public enum InstanceType
L2GuardInstance(L2Attackable),
L2QuestGuardInstance(L2GuardInstance),
L2MonsterInstance(L2Attackable),
+ L2BlockInstance(L2Attackable),
L2ChestInstance(L2MonsterInstance),
L2ControllableMobInstance(L2MonsterInstance),
L2FeedableBeastInstance(L2MonsterInstance),
diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/enums/NpcInfoType.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/enums/NpcInfoType.java
index 40c34b99ab..036787eb61 100644
--- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/enums/NpcInfoType.java
+++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/enums/NpcInfoType.java
@@ -45,7 +45,7 @@ public enum NpcInfoType implements IUpdateTypeComponent
ENCHANT(0x10, 4),
FLYING(0x11, 4),
CLONE(0x12, 4),
- UNKNOWN8(0x13, 4),
+ COLOR_EFFECT(0x13, 4),
DISPLAY_EFFECT(0x16, 4),
TRANSFORMATION(0x17, 4),
diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/skills/Skill.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/skills/Skill.java
index ee4e2714c6..18c19ffce7 100644
--- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/skills/Skill.java
+++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/skills/Skill.java
@@ -42,13 +42,10 @@ import com.l2jmobius.gameserver.handler.AffectScopeHandler;
import com.l2jmobius.gameserver.handler.IAffectScopeHandler;
import com.l2jmobius.gameserver.handler.ITargetTypeHandler;
import com.l2jmobius.gameserver.handler.TargetHandler;
-import com.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager;
-import com.l2jmobius.gameserver.model.ArenaParticipantsHolder;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.PcCondOverride;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
-import com.l2jmobius.gameserver.model.actor.instance.L2BlockInstance;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.cubic.CubicInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
@@ -1404,71 +1401,31 @@ public final class Skill implements IIdentifiable
*/
public final void activateSkill(L2Character caster, CubicInstance cubic, L2ItemInstance item, L2Object... targets)
{
- // TODO: replace with AI
- switch (getId())
+ for (L2Object targetObject : targets)
{
- case 5852:
- case 5853:
+ if (!targetObject.isCharacter())
{
- final L2BlockInstance block = targets[0] instanceof L2BlockInstance ? (L2BlockInstance) targets[0] : null;
- final L2PcInstance player = caster.isPlayer() ? (L2PcInstance) caster : null;
- if ((block == null) || (player == null))
- {
- return;
- }
-
- final int arena = player.getBlockCheckerArena();
- if (arena != -1)
- {
- final ArenaParticipantsHolder holder = HandysBlockCheckerManager.getInstance().getHolder(arena);
- if (holder == null)
- {
- return;
- }
-
- final int team = holder.getPlayerTeam(player);
- final int color = block.getColorEffect();
- if ((team == 0) && (color == 0x00))
- {
- block.changeColor(player, holder, team);
- }
- else if ((team == 1) && (color == 0x53))
- {
- block.changeColor(player, holder, team);
- }
- }
- break;
+ continue;
}
- default:
+
+ final L2Character target = (L2Character) targetObject;
+ if (Formulas.calcBuffDebuffReflection(target, this))
{
- for (L2Object targetObject : targets)
- {
- if (!targetObject.isCharacter())
- {
- continue;
- }
-
- final L2Character target = (L2Character) targetObject;
- if (Formulas.calcBuffDebuffReflection(target, this))
- {
- // if skill is reflected instant effects should be casted on target
- // and continuous effects on caster
- applyEffects(target, caster, false, 0);
-
- final BuffInfo info = new BuffInfo(caster, target, this, false, item, null);
- applyEffectScope(EffectScope.GENERAL, info, true, false);
-
- final EffectScope pvpOrPveEffectScope = caster.isPlayable() && target.isAttackable() ? EffectScope.PVE : caster.isPlayable() && target.isPlayable() ? EffectScope.PVP : null;
- applyEffectScope(pvpOrPveEffectScope, info, true, false);
-
- applyEffectScope(EffectScope.CHANNELING, info, true, false);
- }
- else
- {
- applyEffects(caster, target, item);
- }
- }
- break;
+ // if skill is reflected instant effects should be casted on target
+ // and continuous effects on caster
+ applyEffects(target, caster, false, 0);
+
+ final BuffInfo info = new BuffInfo(caster, target, this, false, item, null);
+ applyEffectScope(EffectScope.GENERAL, info, true, false);
+
+ final EffectScope pvpOrPveEffectScope = caster.isPlayable() && target.isAttackable() ? EffectScope.PVE : caster.isPlayable() && target.isPlayable() ? EffectScope.PVP : null;
+ applyEffectScope(pvpOrPveEffectScope, info, true, false);
+
+ applyEffectScope(EffectScope.CHANNELING, info, true, false);
+ }
+ else
+ {
+ applyEffects(caster, target, item);
}
}
diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/ExPetInfo.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/ExPetInfo.java
index 39c5a756c7..05dc405f2f 100644
--- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/ExPetInfo.java
+++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/ExPetInfo.java
@@ -158,7 +158,7 @@ public class ExPetInfo extends AbstractMaskPacket
addComponentType(NpcInfoType.CLAN);
}
- addComponentType(NpcInfoType.UNKNOWN8);
+ addComponentType(NpcInfoType.COLOR_EFFECT);
// TODO: Confirm me
if (summon.isInCombat())
@@ -312,7 +312,7 @@ public class ExPetInfo extends AbstractMaskPacket
{
packet.writeD(0x00); // Player ObjectId with Decoy
}
- if (containsMask(NpcInfoType.UNKNOWN8))
+ if (containsMask(NpcInfoType.COLOR_EFFECT))
{
// No visual effect
packet.writeD(0x00); // Unknown
diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/NpcInfo.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/NpcInfo.java
index 5bc3f96e20..d3bf66b8e2 100644
--- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/NpcInfo.java
+++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/NpcInfo.java
@@ -184,7 +184,7 @@ public class NpcInfo extends AbstractMaskPacket
}
}
- addComponentType(NpcInfoType.UNKNOWN8);
+ addComponentType(NpcInfoType.COLOR_EFFECT);
if (npc.getPvpFlag() > 0)
{
@@ -345,10 +345,9 @@ public class NpcInfo extends AbstractMaskPacket
{
packet.writeD(_npc.getCloneObjId()); // Player ObjectId with Decoy
}
- if (containsMask(NpcInfoType.UNKNOWN8))
+ if (containsMask(NpcInfoType.COLOR_EFFECT))
{
- // No visual effect
- packet.writeD(0x00); // Unknown
+ packet.writeD(_npc.getColorEffect()); // Color effect
}
if (containsMask(NpcInfoType.DISPLAY_EFFECT))
{
diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/SummonInfo.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/SummonInfo.java
index ea2dcc0716..82f939d4c7 100644
--- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/SummonInfo.java
+++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/SummonInfo.java
@@ -158,7 +158,7 @@ public class SummonInfo extends AbstractMaskPacket
addComponentType(NpcInfoType.CLAN);
}
- addComponentType(NpcInfoType.UNKNOWN8);
+ addComponentType(NpcInfoType.COLOR_EFFECT);
// TODO: Confirm me
if (summon.isInCombat())
@@ -312,7 +312,7 @@ public class SummonInfo extends AbstractMaskPacket
{
packet.writeD(0x00); // Player ObjectId with Decoy
}
- if (containsMask(NpcInfoType.UNKNOWN8))
+ if (containsMask(NpcInfoType.COLOR_EFFECT))
{
// No visual effect
packet.writeD(0x00); // Unknown