Addition of water damage task.
This commit is contained in:
@@ -30,6 +30,16 @@ import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
|||||||
|
|
||||||
public class World
|
public class World
|
||||||
{
|
{
|
||||||
|
public static final int TILE_SIZE = 32768;
|
||||||
|
public static final int TILE_X_MIN = 11;
|
||||||
|
public static final int TILE_Y_MIN = 10;
|
||||||
|
// public static final int TILE_X_MAX = 26;
|
||||||
|
// public static final int TILE_Y_MAX = 26;
|
||||||
|
public static final int TILE_ZERO_COORD_X = 20;
|
||||||
|
public static final int TILE_ZERO_COORD_Y = 18;
|
||||||
|
public static final int MAP_MIN_X = (TILE_X_MIN - TILE_ZERO_COORD_X) * TILE_SIZE;
|
||||||
|
public static final int MAP_MIN_Y = (TILE_Y_MIN - TILE_ZERO_COORD_Y) * TILE_SIZE;
|
||||||
|
|
||||||
private final Map<String, PlayerInstance> _allPlayers = new ConcurrentHashMap<>();
|
private final Map<String, PlayerInstance> _allPlayers = new ConcurrentHashMap<>();
|
||||||
private final Map<Integer, WorldObject> _allObjects = new ConcurrentHashMap<>();
|
private final Map<Integer, WorldObject> _allObjects = new ConcurrentHashMap<>();
|
||||||
private final Map<Integer, WorldObject> _visibleObjects = new ConcurrentHashMap<>();
|
private final Map<Integer, WorldObject> _visibleObjects = new ConcurrentHashMap<>();
|
||||||
|
@@ -135,6 +135,7 @@ public class PlayerInstance extends Creature
|
|||||||
private long _uptime;
|
private long _uptime;
|
||||||
public byte updateKnownCounter = 0;
|
public byte updateKnownCounter = 0;
|
||||||
private Creature _interactTarget;
|
private Creature _interactTarget;
|
||||||
|
private static Timer _waterTimer = null;
|
||||||
|
|
||||||
public Skill addSkill(Skill newSkill)
|
public Skill addSkill(Skill newSkill)
|
||||||
{
|
{
|
||||||
@@ -871,6 +872,11 @@ public class PlayerInstance extends Creature
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reduceCurrentHp(int amount, Creature attacker)
|
public void reduceCurrentHp(int amount, Creature attacker)
|
||||||
|
{
|
||||||
|
reduceCurrentHp(amount, attacker, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reduceCurrentHp(int amount, Creature attacker, boolean sendMessage)
|
||||||
{
|
{
|
||||||
if (isInvul())
|
if (isInvul())
|
||||||
{
|
{
|
||||||
@@ -889,24 +895,31 @@ public class PlayerInstance extends Creature
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Damage message.
|
// Damage message.
|
||||||
final SystemMessage smsg = new SystemMessage(SystemMessage.S1_GAVE_YOU_S2_DMG);
|
if (sendMessage)
|
||||||
if ((attacker instanceof MonsterInstance) || (attacker instanceof NpcInstance))
|
|
||||||
{
|
{
|
||||||
final int mobId = ((NpcInstance) attacker).getNpcTemplate().getNpcId();
|
final SystemMessage msg = new SystemMessage(SystemMessage.S1_GAVE_YOU_S2_DMG);
|
||||||
smsg.addNpcName(mobId);
|
if ((attacker instanceof MonsterInstance) || (attacker instanceof NpcInstance))
|
||||||
|
{
|
||||||
|
final int mobId = ((NpcInstance) attacker).getNpcTemplate().getNpcId();
|
||||||
|
msg.addNpcName(mobId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg.addString(attacker.getName());
|
||||||
|
}
|
||||||
|
msg.addNumber(amount);
|
||||||
|
sendPacket(msg);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
smsg.addString(attacker.getName());
|
|
||||||
}
|
|
||||||
smsg.addNumber(amount);
|
|
||||||
sendPacket(smsg);
|
|
||||||
|
|
||||||
|
// Dead check.
|
||||||
if (!isDead())
|
if (!isDead())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Stop water task.
|
||||||
|
stopWaterTask();
|
||||||
|
|
||||||
// Calculate Karma lost.
|
// Calculate Karma lost.
|
||||||
if (getKarma() > 0)
|
if (getKarma() > 0)
|
||||||
{
|
{
|
||||||
@@ -921,12 +934,17 @@ public class PlayerInstance extends Creature
|
|||||||
getInventory().dropItem(item, 1);
|
getInventory().dropItem(item, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
decreaseKarma();
|
|
||||||
|
// Not self inflicted damage.
|
||||||
|
if (attacker != this)
|
||||||
|
{
|
||||||
|
decreaseKarma();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Died from player.
|
// Died from player.
|
||||||
final PlayerInstance killer = attacker.getActingPlayer();
|
final PlayerInstance killer = attacker.getActingPlayer();
|
||||||
if (killer != null)
|
if ((killer != null) && (killer != this))
|
||||||
{
|
{
|
||||||
if (_pvpFlag > 0)
|
if (_pvpFlag > 0)
|
||||||
{
|
{
|
||||||
@@ -936,7 +954,6 @@ public class PlayerInstance extends Creature
|
|||||||
else if (_karma == 0)
|
else if (_karma == 0)
|
||||||
{
|
{
|
||||||
killer.increasePkKillsAndKarma(getLevel());
|
killer.increasePkKillsAndKarma(getLevel());
|
||||||
killer.sendPacket(new UserInfo(killer));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1806,6 +1823,95 @@ public class PlayerInstance extends Creature
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void checkWaterState()
|
||||||
|
{
|
||||||
|
// Water level.
|
||||||
|
if (getZ() < -3779) // TODO: Water zones.
|
||||||
|
{
|
||||||
|
// Banned "underwater" map regions.
|
||||||
|
final int regionX = ((getX() - World.MAP_MIN_X) >> 15) + World.TILE_X_MIN;
|
||||||
|
final int regionY = ((getY() - World.MAP_MIN_Y) >> 15) + World.TILE_Y_MIN;
|
||||||
|
// TODO: Check for more?
|
||||||
|
if (((regionX == 18) && (regionY == 19)) // School of Dark Arts
|
||||||
|
|| ((regionX == 18) && (regionY == 23)) // Forgotten Temple
|
||||||
|
|| ((regionX == 19) && (regionY == 23)) // Ant Nest
|
||||||
|
|| ((regionX == 20) && (regionY == 18)) // Dark Elf Village
|
||||||
|
|| ((regionX == 20) && (regionY == 21)) // Cruma Tower
|
||||||
|
|| ((regionX == 21) && (regionY == 18)) // Sea of Spores
|
||||||
|
|| ((regionX == 22) && (regionY == 18)) // Ivory Tower
|
||||||
|
|| ((regionX == 24) && (regionY == 21)) // Lair of Antharas
|
||||||
|
|| ((regionX == 25) && (regionY == 12)) // Mithril Mines
|
||||||
|
|| ((regionX == 25) && (regionY == 19)) // Giant's Cave
|
||||||
|
|| ((regionX == 25) && (regionY == 21)) // Antharas Nest
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
startWaterTask();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stopWaterTask();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isInWater()
|
||||||
|
{
|
||||||
|
return _waterTimer != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startWaterTask()
|
||||||
|
{
|
||||||
|
if ((_waterTimer == null) && !isDead())
|
||||||
|
{
|
||||||
|
_waterTimer = new Timer();
|
||||||
|
_waterTimer.schedule(new waterTask(this), 86000, 1000);
|
||||||
|
sendPacket(new SetupGauge(SetupGauge.CYAN, 86000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopWaterTask()
|
||||||
|
{
|
||||||
|
if (_waterTimer != null)
|
||||||
|
{
|
||||||
|
_waterTimer.cancel();
|
||||||
|
_waterTimer = null;
|
||||||
|
sendPacket(new SetupGauge(SetupGauge.CYAN, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class waterTask extends TimerTask
|
||||||
|
{
|
||||||
|
private final PlayerInstance _player;
|
||||||
|
|
||||||
|
public waterTask(PlayerInstance player)
|
||||||
|
{
|
||||||
|
_player = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int reduceHp = (int) (getMaxHp() / 100.0);
|
||||||
|
if (reduceHp < 1)
|
||||||
|
{
|
||||||
|
reduceHp = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
reduceCurrentHp(reduceHp, _player, false);
|
||||||
|
final SystemMessage sm = new SystemMessage(SystemMessage.DROWN_DAMAGE_S1);
|
||||||
|
sm.addNumber(reduceHp);
|
||||||
|
sendPacket(sm);
|
||||||
|
}
|
||||||
|
catch (Throwable e)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PlayerInstance getActingPlayer()
|
public PlayerInstance getActingPlayer()
|
||||||
{
|
{
|
||||||
|
@@ -20,6 +20,7 @@ package org.l2jmobius.gameserver.network.clientpackets;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.Announcements;
|
import org.l2jmobius.gameserver.Announcements;
|
||||||
|
import org.l2jmobius.gameserver.data.MapRegionTable;
|
||||||
import org.l2jmobius.gameserver.managers.GmListManager;
|
import org.l2jmobius.gameserver.managers.GmListManager;
|
||||||
import org.l2jmobius.gameserver.model.Clan;
|
import org.l2jmobius.gameserver.model.Clan;
|
||||||
import org.l2jmobius.gameserver.model.ShortCut;
|
import org.l2jmobius.gameserver.model.ShortCut;
|
||||||
@@ -31,6 +32,7 @@ import org.l2jmobius.gameserver.network.serverpackets.Die;
|
|||||||
import org.l2jmobius.gameserver.network.serverpackets.ItemList;
|
import org.l2jmobius.gameserver.network.serverpackets.ItemList;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
|
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
||||||
|
import org.l2jmobius.gameserver.network.serverpackets.TeleportToLocation;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
|
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
|
||||||
|
|
||||||
public class EnterWorld extends ClientBasePacket
|
public class EnterWorld extends ClientBasePacket
|
||||||
@@ -91,6 +93,29 @@ public class EnterWorld extends ClientBasePacket
|
|||||||
}
|
}
|
||||||
World.getInstance().addVisibleObject(activeChar);
|
World.getInstance().addVisibleObject(activeChar);
|
||||||
notifyClanMembers(activeChar);
|
notifyClanMembers(activeChar);
|
||||||
|
|
||||||
|
// Fallen in game graphics?
|
||||||
|
if (activeChar.getZ() < -16000)
|
||||||
|
{
|
||||||
|
final int[] townCords = MapRegionTable.getInstance().getClosestTownCords(activeChar);
|
||||||
|
activeChar.sendPacket(new TeleportToLocation(activeChar, townCords[0], townCords[1], townCords[2]));
|
||||||
|
World.getInstance().removeVisibleObject(activeChar);
|
||||||
|
activeChar.removeAllKnownObjects();
|
||||||
|
activeChar.setX(townCords[0]);
|
||||||
|
activeChar.setY(townCords[1]);
|
||||||
|
activeChar.setZ(townCords[2]);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Thread.sleep(2000L);
|
||||||
|
}
|
||||||
|
catch (InterruptedException e)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
World.getInstance().addVisibleObject(activeChar);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Water check.
|
||||||
|
activeChar.checkWaterState();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void notifyClanMembers(PlayerInstance activeChar)
|
private void notifyClanMembers(PlayerInstance activeChar)
|
||||||
|
@@ -41,6 +41,13 @@ public class Logout extends ClientBasePacket
|
|||||||
player.sendPacket(new ActionFailed());
|
player.sendPacket(new ActionFailed());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (player.isInWater() && (player.getZ() > -16000))
|
||||||
|
{
|
||||||
|
player.sendMessage("You cannot exit the game under water.");
|
||||||
|
player.sendPacket(new ActionFailed());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final LeaveWorld ql = new LeaveWorld();
|
final LeaveWorld ql = new LeaveWorld();
|
||||||
client.getConnection().sendPacket(ql);
|
client.getConnection().sendPacket(ql);
|
||||||
player.deleteMe();
|
player.deleteMe();
|
||||||
|
@@ -18,6 +18,7 @@
|
|||||||
package org.l2jmobius.gameserver.network.clientpackets;
|
package org.l2jmobius.gameserver.network.clientpackets;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.enums.CreatureState;
|
import org.l2jmobius.gameserver.enums.CreatureState;
|
||||||
|
import org.l2jmobius.gameserver.model.World;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||||
import org.l2jmobius.gameserver.network.ClientThread;
|
import org.l2jmobius.gameserver.network.ClientThread;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
|
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
|
||||||
@@ -49,12 +50,20 @@ public class MoveBackwardToLocation extends ClientBasePacket
|
|||||||
activeChar.sendPacket(ac);
|
activeChar.sendPacket(ac);
|
||||||
activeChar.broadcastPacket(ac);
|
activeChar.broadcastPacket(ac);
|
||||||
}
|
}
|
||||||
|
|
||||||
activeChar.setInCombat(false);
|
activeChar.setInCombat(false);
|
||||||
activeChar.setCurrentState(CreatureState.IDLE);
|
activeChar.setCurrentState(CreatureState.IDLE);
|
||||||
activeChar.setX(originX);
|
activeChar.setX(originX);
|
||||||
activeChar.setY(originY);
|
activeChar.setY(originY);
|
||||||
activeChar.setZ(originZ);
|
activeChar.setZ(originZ);
|
||||||
activeChar.moveTo(targetX, targetY, targetZ, 0);
|
activeChar.moveTo(targetX, targetY, targetZ, 0);
|
||||||
|
|
||||||
|
final int x = ((activeChar.getX() - World.MAP_MIN_X) >> 15) + World.TILE_X_MIN;
|
||||||
|
final int y = ((activeChar.getY() - World.MAP_MIN_Y) >> 15) + World.TILE_Y_MIN;
|
||||||
|
System.out.println(x + " " + y);
|
||||||
|
|
||||||
|
// Water check.
|
||||||
|
activeChar.checkWaterState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of the L2J Mobius project.
|
lo * This file is part of the L2J Mobius project.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -42,6 +42,13 @@ public class RequestRestart extends ClientBasePacket
|
|||||||
player.sendPacket(new ActionFailed());
|
player.sendPacket(new ActionFailed());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (player.isInWater() && (player.getZ() > -16000))
|
||||||
|
{
|
||||||
|
player.sendMessage("You cannot exit the game under water.");
|
||||||
|
player.sendPacket(new ActionFailed());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
player.deleteMe();
|
player.deleteMe();
|
||||||
final RestartResponse response = new RestartResponse();
|
final RestartResponse response = new RestartResponse();
|
||||||
client.getConnection().sendPacket(response);
|
client.getConnection().sendPacket(response);
|
||||||
|
@@ -92,6 +92,9 @@ public class ValidatePosition extends ClientBasePacket
|
|||||||
}
|
}
|
||||||
activeChar.updateKnownCounter = 0;
|
activeChar.updateKnownCounter = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Water check.
|
||||||
|
activeChar.checkWaterState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user