Custom Ghost Walking buff when TvT member resurrects.

This commit is contained in:
MobiusDev 2017-12-12 00:02:16 +00:00
parent 07e95bb19a
commit 8f2b258395
15 changed files with 339 additions and 30 deletions

View File

@ -67,6 +67,7 @@ public class TvT extends Event
// NPC
private static final int MANAGER = 70010;
// Skills
private static final SkillHolder GHOST_WALKING = new SkillHolder(100000, 1); // Custom Ghost Walking
private static final SkillHolder KNIGHT = new SkillHolder(15648, 1); // Knight's Harmony (Adventurer)
private static final SkillHolder WARRIOR = new SkillHolder(15649, 1); // Warrior's Harmony (Adventurer)
private static final SkillHolder WIZARD = new SkillHolder(15650, 1); // Wizard's Harmony (Adventurer)
@ -466,11 +467,19 @@ public class TvT extends Event
{
player.setIsPendingRevive(true);
player.teleToLocation(BLUE_SPAWN_LOC, false, PVP_WORLD);
// Make player invulnerable for 30 seconds.
GHOST_WALKING.getSkill().applyEffects(player, player);
// Reset existing activity timers.
resetActivityTimers(player); // In case player died in peace zone.
}
else if (RED_TEAM.contains(player))
{
player.setIsPendingRevive(true);
player.teleToLocation(RED_SPAWN_LOC, false, PVP_WORLD);
// Make player invulnerable for 30 seconds.
GHOST_WALKING.getSkill().applyEffects(player, player);
// Reset existing activity timers.
resetActivityTimers(player); // In case player died in peace zone.
}
}
break;
@ -570,8 +579,7 @@ public class TvT extends Event
((((zone == BLUE_PEACE_ZONE) && (character.getTeam() == Team.BLUE)) || //
((zone == RED_PEACE_ZONE) && (character.getTeam() == Team.RED)))))
{
startQuestTimer("KickPlayer" + character.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? INACTIVITY_TIME * 60000 : (INACTIVITY_TIME * 60000) + (WAIT_TIME * 60000), null, character.getActingPlayer());
startQuestTimer("KickPlayerWarning" + character.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? (INACTIVITY_TIME / 2) * 60000 : ((INACTIVITY_TIME / 2) * 60000) + (WAIT_TIME * 60000), null, character.getActingPlayer());
resetActivityTimers(character.getActingPlayer());
}
}
return null;
@ -582,8 +590,14 @@ public class TvT extends Event
{
if (character.isPlayer() && character.getActingPlayer().isOnCustomEvent())
{
cancelQuestTimer("KickPlayer" + character.getObjectId(), null, character.getActingPlayer());
cancelQuestTimer("KickPlayerWarning" + character.getObjectId(), null, character.getActingPlayer());
final L2PcInstance player = character.getActingPlayer();
cancelQuestTimer("KickPlayer" + character.getObjectId(), null, player);
cancelQuestTimer("KickPlayerWarning" + character.getObjectId(), null, player);
// Removed invulnerability shield.
if (player.isAffectedBySkill(GHOST_WALKING))
{
player.getEffectList().stopSkillEffects(true, GHOST_WALKING.getSkill());
}
}
return super.onExitZone(character, zone);
}
@ -718,6 +732,14 @@ public class TvT extends Event
}
}
private void resetActivityTimers(L2PcInstance player)
{
cancelQuestTimer("KickPlayer" + player.getObjectId(), null, player);
cancelQuestTimer("KickPlayerWarning" + player.getObjectId(), null, player);
startQuestTimer("KickPlayer" + player.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? INACTIVITY_TIME * 60000 : (INACTIVITY_TIME * 60000) + (WAIT_TIME * 60000), null, player);
startQuestTimer("KickPlayerWarning" + player.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? (INACTIVITY_TIME / 2) * 60000 : ((INACTIVITY_TIME / 2) * 60000) + (WAIT_TIME * 60000), null, player);
}
private void manageForfeit()
{
cancelQuestTimer("10", null, null);

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/skills.xsd">
<skill id="100000" displayId="770" toLevel="1" name="Ghost Walking">
<abnormalLvl>1</abnormalLvl>
<abnormalTime>30</abnormalTime>
<abnormalType>NONE</abnormalType>
<abnormalVisualEffect>RO_GHOST_REFLECT</abnormalVisualEffect>
<icon>icon.skill01418</icon>
<operateType>A2</operateType>
<removedOnAnyActionExceptMove>true</removedOnAnyActionExceptMove>
<hitTime>500</hitTime>
<coolTime>500</coolTime>
<reuseDelay>600000</reuseDelay>
<staticReuse>true</staticReuse>
<effectPoint>867</effectPoint>
<isMagic>1</isMagic>
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
<basicProperty>NONE</basicProperty>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="Speed">
<amount>33</amount>
<mode>DIFF</mode>
</effect>
<effect name="DamageBlock">
<type>BLOCK_HP</type>
</effect>
<effect name="DamageBlock">
<type>BLOCK_MP</type>
</effect>
<effect name="DebuffBlock" />
<effect name="ResistDispelByCategory">
<amount>-100</amount>
<slot>ALL</slot>
</effect>
</effects>
</skill>
</list>

View File

@ -1987,7 +1987,6 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pAtkMod" type="xs:unsignedByte" />
<xs:element name="isSummonSpawn" type="xs:boolean" />
<xs:element name="randomOffset" type="xs:unsignedByte" />
<xs:element name="debuffModifier" type="xs:decimal" />
@ -2023,6 +2022,7 @@
</xs:element>
<xs:element name="damageModifier" type="xs:decimal" />
<xs:element name="animationSpeed" type="xs:unsignedShort" />
<xs:element name="pAtkMod" type="xs:unsignedByte" />
</xs:choice>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
@ -2755,12 +2755,13 @@
<xs:element name="despawnDelay" type="xs:unsignedInt" />
</xs:choice>
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedShort" use="required" />
<xs:attribute name="id" type="xs:unsignedInt" use="required" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="levels" type="xs:unsignedByte" use="optional" />
<xs:attribute name="fromLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="usingServerSideName" type="xs:boolean" use="optional" />
<xs:attribute name="displayId" type="xs:unsignedShort" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>

View File

@ -67,6 +67,7 @@ public class TvT extends Event
// NPC
private static final int MANAGER = 70010;
// Skills
private static final SkillHolder GHOST_WALKING = new SkillHolder(100000, 1); // Custom Ghost Walking
private static final SkillHolder KNIGHT = new SkillHolder(15648, 1); // Knight's Harmony (Adventurer)
private static final SkillHolder WARRIOR = new SkillHolder(15649, 1); // Warrior's Harmony (Adventurer)
private static final SkillHolder WIZARD = new SkillHolder(15650, 1); // Wizard's Harmony (Adventurer)
@ -466,11 +467,19 @@ public class TvT extends Event
{
player.setIsPendingRevive(true);
player.teleToLocation(BLUE_SPAWN_LOC, false, PVP_WORLD);
// Make player invulnerable for 30 seconds.
GHOST_WALKING.getSkill().applyEffects(player, player);
// Reset existing activity timers.
resetActivityTimers(player); // In case player died in peace zone.
}
else if (RED_TEAM.contains(player))
{
player.setIsPendingRevive(true);
player.teleToLocation(RED_SPAWN_LOC, false, PVP_WORLD);
// Make player invulnerable for 30 seconds.
GHOST_WALKING.getSkill().applyEffects(player, player);
// Reset existing activity timers.
resetActivityTimers(player); // In case player died in peace zone.
}
}
break;
@ -570,8 +579,7 @@ public class TvT extends Event
((((zone == BLUE_PEACE_ZONE) && (character.getTeam() == Team.BLUE)) || //
((zone == RED_PEACE_ZONE) && (character.getTeam() == Team.RED)))))
{
startQuestTimer("KickPlayer" + character.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? INACTIVITY_TIME * 60000 : (INACTIVITY_TIME * 60000) + (WAIT_TIME * 60000), null, character.getActingPlayer());
startQuestTimer("KickPlayerWarning" + character.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? (INACTIVITY_TIME / 2) * 60000 : ((INACTIVITY_TIME / 2) * 60000) + (WAIT_TIME * 60000), null, character.getActingPlayer());
resetActivityTimers(character.getActingPlayer());
}
}
return null;
@ -582,8 +590,14 @@ public class TvT extends Event
{
if (character.isPlayer() && character.getActingPlayer().isOnCustomEvent())
{
cancelQuestTimer("KickPlayer" + character.getObjectId(), null, character.getActingPlayer());
cancelQuestTimer("KickPlayerWarning" + character.getObjectId(), null, character.getActingPlayer());
final L2PcInstance player = character.getActingPlayer();
cancelQuestTimer("KickPlayer" + character.getObjectId(), null, player);
cancelQuestTimer("KickPlayerWarning" + character.getObjectId(), null, player);
// Removed invulnerability shield.
if (player.isAffectedBySkill(GHOST_WALKING))
{
player.getEffectList().stopSkillEffects(true, GHOST_WALKING.getSkill());
}
}
return super.onExitZone(character, zone);
}
@ -718,6 +732,14 @@ public class TvT extends Event
}
}
private void resetActivityTimers(L2PcInstance player)
{
cancelQuestTimer("KickPlayer" + player.getObjectId(), null, player);
cancelQuestTimer("KickPlayerWarning" + player.getObjectId(), null, player);
startQuestTimer("KickPlayer" + player.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? INACTIVITY_TIME * 60000 : (INACTIVITY_TIME * 60000) + (WAIT_TIME * 60000), null, player);
startQuestTimer("KickPlayerWarning" + player.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? (INACTIVITY_TIME / 2) * 60000 : ((INACTIVITY_TIME / 2) * 60000) + (WAIT_TIME * 60000), null, player);
}
private void manageForfeit()
{
cancelQuestTimer("10", null, null);

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/skills.xsd">
<skill id="100000" displayId="770" toLevel="1" name="Ghost Walking">
<abnormalLvl>1</abnormalLvl>
<abnormalTime>30</abnormalTime>
<abnormalType>NONE</abnormalType>
<abnormalVisualEffect>RO_GHOST_REFLECT</abnormalVisualEffect>
<icon>icon.skill01418</icon>
<operateType>A2</operateType>
<removedOnAnyActionExceptMove>true</removedOnAnyActionExceptMove>
<hitTime>500</hitTime>
<coolTime>500</coolTime>
<reuseDelay>600000</reuseDelay>
<staticReuse>true</staticReuse>
<effectPoint>867</effectPoint>
<isMagic>1</isMagic>
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
<basicProperty>NONE</basicProperty>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="Speed">
<amount>33</amount>
<mode>DIFF</mode>
</effect>
<effect name="DamageBlock">
<type>BLOCK_HP</type>
</effect>
<effect name="DamageBlock">
<type>BLOCK_MP</type>
</effect>
<effect name="DebuffBlock" />
<effect name="ResistDispelByCategory">
<amount>-100</amount>
<slot>ALL</slot>
</effect>
</effects>
</skill>
</list>

View File

@ -2075,7 +2075,6 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pAtkMod" type="xs:unsignedByte" />
<xs:element name="isSummonSpawn" type="xs:boolean" />
<xs:element name="randomOffset" type="xs:unsignedByte" />
<xs:element name="HATE">
@ -2111,6 +2110,7 @@
<xs:element name="debuffModifier" type="xs:decimal" />
<xs:element name="damageModifier" type="xs:decimal" />
<xs:element name="animationSpeed" type="xs:unsignedShort" />
<xs:element name="pAtkMod" type="xs:unsignedByte" />
</xs:choice>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
@ -2878,12 +2878,13 @@
<xs:element name="despawnDelay" type="xs:unsignedInt" />
</xs:choice>
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedShort" use="required" />
<xs:attribute name="id" type="xs:unsignedInt" use="required" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="levels" type="xs:unsignedByte" use="optional" />
<xs:attribute name="fromLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="usingServerSideName" type="xs:boolean" use="optional" />
<xs:attribute name="displayId" type="xs:unsignedShort" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>

View File

@ -67,6 +67,7 @@ public class TvT extends Event
// NPC
private static final int MANAGER = 70010;
// Skills
private static final SkillHolder GHOST_WALKING = new SkillHolder(100000, 1); // Custom Ghost Walking
private static final SkillHolder KNIGHT = new SkillHolder(15648, 1); // Knight's Harmony (Adventurer)
private static final SkillHolder WARRIOR = new SkillHolder(15649, 1); // Warrior's Harmony (Adventurer)
private static final SkillHolder WIZARD = new SkillHolder(15650, 1); // Wizard's Harmony (Adventurer)
@ -466,11 +467,19 @@ public class TvT extends Event
{
player.setIsPendingRevive(true);
player.teleToLocation(BLUE_SPAWN_LOC, false, PVP_WORLD);
// Make player invulnerable for 30 seconds.
GHOST_WALKING.getSkill().applyEffects(player, player);
// Reset existing activity timers.
resetActivityTimers(player); // In case player died in peace zone.
}
else if (RED_TEAM.contains(player))
{
player.setIsPendingRevive(true);
player.teleToLocation(RED_SPAWN_LOC, false, PVP_WORLD);
// Make player invulnerable for 30 seconds.
GHOST_WALKING.getSkill().applyEffects(player, player);
// Reset existing activity timers.
resetActivityTimers(player); // In case player died in peace zone.
}
}
break;
@ -570,8 +579,7 @@ public class TvT extends Event
((((zone == BLUE_PEACE_ZONE) && (character.getTeam() == Team.BLUE)) || //
((zone == RED_PEACE_ZONE) && (character.getTeam() == Team.RED)))))
{
startQuestTimer("KickPlayer" + character.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? INACTIVITY_TIME * 60000 : (INACTIVITY_TIME * 60000) + (WAIT_TIME * 60000), null, character.getActingPlayer());
startQuestTimer("KickPlayerWarning" + character.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? (INACTIVITY_TIME / 2) * 60000 : ((INACTIVITY_TIME / 2) * 60000) + (WAIT_TIME * 60000), null, character.getActingPlayer());
resetActivityTimers(character.getActingPlayer());
}
}
return null;
@ -582,8 +590,14 @@ public class TvT extends Event
{
if (character.isPlayer() && character.getActingPlayer().isOnCustomEvent())
{
cancelQuestTimer("KickPlayer" + character.getObjectId(), null, character.getActingPlayer());
cancelQuestTimer("KickPlayerWarning" + character.getObjectId(), null, character.getActingPlayer());
final L2PcInstance player = character.getActingPlayer();
cancelQuestTimer("KickPlayer" + character.getObjectId(), null, player);
cancelQuestTimer("KickPlayerWarning" + character.getObjectId(), null, player);
// Removed invulnerability shield.
if (player.isAffectedBySkill(GHOST_WALKING))
{
player.getEffectList().stopSkillEffects(true, GHOST_WALKING.getSkill());
}
}
return super.onExitZone(character, zone);
}
@ -718,6 +732,14 @@ public class TvT extends Event
}
}
private void resetActivityTimers(L2PcInstance player)
{
cancelQuestTimer("KickPlayer" + player.getObjectId(), null, player);
cancelQuestTimer("KickPlayerWarning" + player.getObjectId(), null, player);
startQuestTimer("KickPlayer" + player.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? INACTIVITY_TIME * 60000 : (INACTIVITY_TIME * 60000) + (WAIT_TIME * 60000), null, player);
startQuestTimer("KickPlayerWarning" + player.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? (INACTIVITY_TIME / 2) * 60000 : ((INACTIVITY_TIME / 2) * 60000) + (WAIT_TIME * 60000), null, player);
}
private void manageForfeit()
{
cancelQuestTimer("10", null, null);

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/skills.xsd">
<skill id="100000" displayId="770" toLevel="1" name="Ghost Walking">
<abnormalLvl>1</abnormalLvl>
<abnormalTime>30</abnormalTime>
<abnormalType>NONE</abnormalType>
<abnormalVisualEffect>RO_GHOST_REFLECT</abnormalVisualEffect>
<icon>icon.skill01418</icon>
<operateType>A2</operateType>
<removedOnAnyActionExceptMove>true</removedOnAnyActionExceptMove>
<hitTime>500</hitTime>
<coolTime>500</coolTime>
<reuseDelay>600000</reuseDelay>
<staticReuse>true</staticReuse>
<effectPoint>867</effectPoint>
<isMagic>1</isMagic>
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
<basicProperty>NONE</basicProperty>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="Speed">
<amount>33</amount>
<mode>DIFF</mode>
</effect>
<effect name="DamageBlock">
<type>BLOCK_HP</type>
</effect>
<effect name="DamageBlock">
<type>BLOCK_MP</type>
</effect>
<effect name="DebuffBlock" />
<effect name="ResistDispelByCategory">
<amount>-100</amount>
<slot>ALL</slot>
</effect>
</effects>
</skill>
</list>

View File

@ -2106,7 +2106,6 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pAtkMod" type="xs:unsignedByte" />
<xs:element name="isSummonSpawn" type="xs:boolean" />
<xs:element name="randomOffset" type="xs:unsignedByte" />
<xs:element name="HATE">
@ -2142,6 +2141,7 @@
<xs:element name="debuffModifier" type="xs:decimal" />
<xs:element name="damageModifier" type="xs:decimal" />
<xs:element name="animationSpeed" type="xs:unsignedShort" />
<xs:element name="pAtkMod" type="xs:unsignedByte" />
</xs:choice>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
@ -2917,12 +2917,13 @@
<xs:element name="despawnDelay" type="xs:unsignedInt" />
</xs:choice>
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedShort" use="required" />
<xs:attribute name="id" type="xs:unsignedInt" use="required" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="levels" type="xs:unsignedByte" use="optional" />
<xs:attribute name="fromLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="usingServerSideName" type="xs:boolean" use="optional" />
<xs:attribute name="displayId" type="xs:unsignedShort" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>

View File

@ -67,6 +67,7 @@ public class TvT extends Event
// NPC
private static final int MANAGER = 70010;
// Skills
private static final SkillHolder GHOST_WALKING = new SkillHolder(100000, 1); // Custom Ghost Walking
private static final SkillHolder KNIGHT = new SkillHolder(15648, 1); // Knight's Harmony (Adventurer)
private static final SkillHolder WARRIOR = new SkillHolder(15649, 1); // Warrior's Harmony (Adventurer)
private static final SkillHolder WIZARD = new SkillHolder(15650, 1); // Wizard's Harmony (Adventurer)
@ -466,11 +467,19 @@ public class TvT extends Event
{
player.setIsPendingRevive(true);
player.teleToLocation(BLUE_SPAWN_LOC, false, PVP_WORLD);
// Make player invulnerable for 30 seconds.
GHOST_WALKING.getSkill().applyEffects(player, player);
// Reset existing activity timers.
resetActivityTimers(player); // In case player died in peace zone.
}
else if (RED_TEAM.contains(player))
{
player.setIsPendingRevive(true);
player.teleToLocation(RED_SPAWN_LOC, false, PVP_WORLD);
// Make player invulnerable for 30 seconds.
GHOST_WALKING.getSkill().applyEffects(player, player);
// Reset existing activity timers.
resetActivityTimers(player); // In case player died in peace zone.
}
}
break;
@ -570,8 +579,7 @@ public class TvT extends Event
((((zone == BLUE_PEACE_ZONE) && (character.getTeam() == Team.BLUE)) || //
((zone == RED_PEACE_ZONE) && (character.getTeam() == Team.RED)))))
{
startQuestTimer("KickPlayer" + character.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? INACTIVITY_TIME * 60000 : (INACTIVITY_TIME * 60000) + (WAIT_TIME * 60000), null, character.getActingPlayer());
startQuestTimer("KickPlayerWarning" + character.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? (INACTIVITY_TIME / 2) * 60000 : ((INACTIVITY_TIME / 2) * 60000) + (WAIT_TIME * 60000), null, character.getActingPlayer());
resetActivityTimers(character.getActingPlayer());
}
}
return null;
@ -582,8 +590,14 @@ public class TvT extends Event
{
if (character.isPlayer() && character.getActingPlayer().isOnCustomEvent())
{
cancelQuestTimer("KickPlayer" + character.getObjectId(), null, character.getActingPlayer());
cancelQuestTimer("KickPlayerWarning" + character.getObjectId(), null, character.getActingPlayer());
final L2PcInstance player = character.getActingPlayer();
cancelQuestTimer("KickPlayer" + character.getObjectId(), null, player);
cancelQuestTimer("KickPlayerWarning" + character.getObjectId(), null, player);
// Removed invulnerability shield.
if (player.isAffectedBySkill(GHOST_WALKING))
{
player.getEffectList().stopSkillEffects(true, GHOST_WALKING.getSkill());
}
}
return super.onExitZone(character, zone);
}
@ -718,6 +732,14 @@ public class TvT extends Event
}
}
private void resetActivityTimers(L2PcInstance player)
{
cancelQuestTimer("KickPlayer" + player.getObjectId(), null, player);
cancelQuestTimer("KickPlayerWarning" + player.getObjectId(), null, player);
startQuestTimer("KickPlayer" + player.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? INACTIVITY_TIME * 60000 : (INACTIVITY_TIME * 60000) + (WAIT_TIME * 60000), null, player);
startQuestTimer("KickPlayerWarning" + player.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? (INACTIVITY_TIME / 2) * 60000 : ((INACTIVITY_TIME / 2) * 60000) + (WAIT_TIME * 60000), null, player);
}
private void manageForfeit()
{
cancelQuestTimer("10", null, null);

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/skills.xsd">
<skill id="100000" displayId="770" toLevel="1" name="Ghost Walking">
<abnormalLvl>1</abnormalLvl>
<abnormalTime>30</abnormalTime>
<abnormalType>NONE</abnormalType>
<abnormalVisualEffect>RO_GHOST_REFLECT</abnormalVisualEffect>
<icon>icon.skill01418</icon>
<operateType>A2</operateType>
<removedOnAnyActionExceptMove>true</removedOnAnyActionExceptMove>
<hitTime>500</hitTime>
<coolTime>500</coolTime>
<reuseDelay>600000</reuseDelay>
<staticReuse>true</staticReuse>
<effectPoint>867</effectPoint>
<isMagic>1</isMagic>
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
<basicProperty>NONE</basicProperty>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="Speed">
<amount>33</amount>
<mode>DIFF</mode>
</effect>
<effect name="DamageBlock">
<type>BLOCK_HP</type>
</effect>
<effect name="DamageBlock">
<type>BLOCK_MP</type>
</effect>
<effect name="DebuffBlock" />
<effect name="ResistDispelByCategory">
<amount>-100</amount>
<slot>ALL</slot>
</effect>
</effects>
</skill>
</list>

View File

@ -2073,7 +2073,6 @@
<xs:element name="addedSkillId" type="xs:unsignedShort" />
<xs:element name="addedSkillLevel" type="xs:unsignedByte" />
<xs:element name="skills" type="xs:string" />
<xs:element name="pAtkMod" type="xs:unsignedByte" />
<xs:element name="isSummonSpawn" type="xs:boolean" />
<xs:element name="randomOffset" type="xs:unsignedByte" />
<xs:element name="AGGRESSION">
@ -2109,6 +2108,7 @@
</xs:element>
<xs:element name="damageModifier" type="xs:decimal" />
<xs:element name="animationSpeed" type="xs:unsignedShort" />
<xs:element name="pAtkMod" type="xs:unsignedByte" />
</xs:choice>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
@ -2928,12 +2928,13 @@
<xs:element name="despawnDelay" type="xs:unsignedInt" />
</xs:choice>
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedShort" use="required" />
<xs:attribute name="id" type="xs:unsignedInt" use="required" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="levels" type="xs:unsignedByte" use="optional" />
<xs:attribute name="fromLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="usingServerSideName" type="xs:boolean" use="optional" />
<xs:attribute name="displayId" type="xs:unsignedShort" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>

View File

@ -86,6 +86,7 @@ public class TvT extends Event
new SkillHolder(4330, 1), // Concentration
new SkillHolder(4331, 1), // Empower
};
private static final SkillHolder GHOST_WALKING = new SkillHolder(100000, 1); // Custom Ghost Walking
// Others
private static final int INSTANCE_ID = 3049;
private static final int BLUE_DOOR_ID = 24190002;
@ -468,11 +469,19 @@ public class TvT extends Event
{
player.setIsPendingRevive(true);
player.teleToLocation(BLUE_SPAWN_LOC, false, PVP_WORLD);
// Make player invulnerable for 30 seconds.
GHOST_WALKING.getSkill().applyEffects(player, player);
// Reset existing activity timers.
resetActivityTimers(player); // In case player died in peace zone.
}
else if (RED_TEAM.contains(player))
{
player.setIsPendingRevive(true);
player.teleToLocation(RED_SPAWN_LOC, false, PVP_WORLD);
// Make player invulnerable for 30 seconds.
GHOST_WALKING.getSkill().applyEffects(player, player);
// Reset existing activity timers.
resetActivityTimers(player); // In case player died in peace zone.
}
}
break;
@ -572,8 +581,7 @@ public class TvT extends Event
((((zone == BLUE_PEACE_ZONE) && (character.getTeam() == Team.BLUE)) || //
((zone == RED_PEACE_ZONE) && (character.getTeam() == Team.RED)))))
{
startQuestTimer("KickPlayer" + character.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? INACTIVITY_TIME * 60000 : (INACTIVITY_TIME * 60000) + (WAIT_TIME * 60000), null, character.getActingPlayer());
startQuestTimer("KickPlayerWarning" + character.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? (INACTIVITY_TIME / 2) * 60000 : ((INACTIVITY_TIME / 2) * 60000) + (WAIT_TIME * 60000), null, character.getActingPlayer());
resetActivityTimers(character.getActingPlayer());
}
}
return null;
@ -584,8 +592,14 @@ public class TvT extends Event
{
if (character.isPlayer() && character.getActingPlayer().isOnCustomEvent())
{
cancelQuestTimer("KickPlayer" + character.getObjectId(), null, character.getActingPlayer());
cancelQuestTimer("KickPlayerWarning" + character.getObjectId(), null, character.getActingPlayer());
final L2PcInstance player = character.getActingPlayer();
cancelQuestTimer("KickPlayer" + character.getObjectId(), null, player);
cancelQuestTimer("KickPlayerWarning" + character.getObjectId(), null, player);
// Removed invulnerability shield.
if (player.isAffectedBySkill(GHOST_WALKING))
{
player.getEffectList().stopSkillEffects(true, GHOST_WALKING.getSkill());
}
}
return super.onExitZone(character, zone);
}
@ -720,6 +734,14 @@ public class TvT extends Event
}
}
private void resetActivityTimers(L2PcInstance player)
{
cancelQuestTimer("KickPlayer" + player.getObjectId(), null, player);
cancelQuestTimer("KickPlayerWarning" + player.getObjectId(), null, player);
startQuestTimer("KickPlayer" + player.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? INACTIVITY_TIME * 60000 : (INACTIVITY_TIME * 60000) + (WAIT_TIME * 60000), null, player);
startQuestTimer("KickPlayerWarning" + player.getObjectId(), PVP_WORLD.getDoor(BLUE_DOOR_ID).isOpen() ? (INACTIVITY_TIME / 2) * 60000 : ((INACTIVITY_TIME / 2) * 60000) + (WAIT_TIME * 60000), null, player);
}
private void manageForfeit()
{
cancelQuestTimer("10", null, null);

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/skills.xsd">
<skill id="100000" displayId="770" toLevel="1" name="Ghost Walking">
<abnormalLvl>1</abnormalLvl>
<abnormalTime>30</abnormalTime>
<abnormalType>NONE</abnormalType>
<abnormalVisualEffect>ULTIMATE_DEFENCE</abnormalVisualEffect>
<icon>icon.skill01418</icon>
<operateType>A2</operateType>
<removedOnAnyActionExceptMove>true</removedOnAnyActionExceptMove>
<hitTime>500</hitTime>
<coolTime>500</coolTime>
<reuseDelay>600000</reuseDelay>
<staticReuse>true</staticReuse>
<effectPoint>867</effectPoint>
<isMagic>1</isMagic>
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
<basicProperty>NONE</basicProperty>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="Speed">
<amount>33</amount>
<mode>DIFF</mode>
</effect>
<effect name="DamageBlock">
<type>BLOCK_HP</type>
</effect>
<effect name="DamageBlock">
<type>BLOCK_MP</type>
</effect>
<effect name="DebuffBlock" />
<effect name="ResistDispelByCategory">
<amount>-100</amount>
<slot>ALL</slot>
</effect>
</effects>
</skill>
</list>

View File

@ -1530,7 +1530,6 @@
<xs:element name="hp" type="xs:unsignedByte" />
<xs:element name="mp" type="xs:unsignedByte" />
<xs:element name="cp" type="xs:unsignedByte" />
<xs:element name="pAtkMod" type="xs:unsignedByte" />
<xs:element name="reputation" type="xs:unsignedByte" />
</xs:choice>
</xs:sequence>
@ -2005,9 +2004,10 @@
<xs:element name="blockActionUseSkill" type="xs:boolean" />
</xs:choice>
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedShort" use="required" />
<xs:attribute name="id" type="xs:unsignedInt" use="required" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="required" />
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="displayId" type="xs:unsignedShort" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>