Addition of water damage task.

This commit is contained in:
MobiusDevelopment
2019-11-23 17:45:33 +00:00
parent 4214e864be
commit 87fa521ddf
7 changed files with 181 additions and 14 deletions

View File

@@ -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<>();

View File

@@ -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)
{
final SystemMessage msg = new SystemMessage(SystemMessage.S1_GAVE_YOU_S2_DMG);
if ((attacker instanceof MonsterInstance) || (attacker instanceof NpcInstance)) if ((attacker instanceof MonsterInstance) || (attacker instanceof NpcInstance))
{ {
final int mobId = ((NpcInstance) attacker).getNpcTemplate().getNpcId(); final int mobId = ((NpcInstance) attacker).getNpcTemplate().getNpcId();
smsg.addNpcName(mobId); msg.addNpcName(mobId);
} }
else else
{ {
smsg.addString(attacker.getName()); msg.addString(attacker.getName());
}
msg.addNumber(amount);
sendPacket(msg);
} }
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);
} }
} }
// Not self inflicted damage.
if (attacker != this)
{
decreaseKarma(); 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()
{ {

View File

@@ -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)

View File

@@ -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();

View File

@@ -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();
} }
} }

View File

@@ -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);

View File

@@ -92,6 +92,9 @@ public class ValidatePosition extends ClientBasePacket
} }
activeChar.updateKnownCounter = 0; activeChar.updateKnownCounter = 0;
} }
// Water check.
activeChar.checkWaterState();
} }
} }