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 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<Integer, WorldObject> _allObjects = new ConcurrentHashMap<>(); | ||||
| 	private final Map<Integer, WorldObject> _visibleObjects = new ConcurrentHashMap<>(); | ||||
|   | ||||
| @@ -135,6 +135,7 @@ public class PlayerInstance extends Creature | ||||
| 	private long _uptime; | ||||
| 	public byte updateKnownCounter = 0; | ||||
| 	private Creature _interactTarget; | ||||
| 	private static Timer _waterTimer = null; | ||||
| 	 | ||||
| 	public Skill addSkill(Skill newSkill) | ||||
| 	{ | ||||
| @@ -871,6 +872,11 @@ public class PlayerInstance extends Creature | ||||
| 	 | ||||
| 	@Override | ||||
| 	public void reduceCurrentHp(int amount, Creature attacker) | ||||
| 	{ | ||||
| 		reduceCurrentHp(amount, attacker, true); | ||||
| 	} | ||||
| 	 | ||||
| 	public void reduceCurrentHp(int amount, Creature attacker, boolean sendMessage) | ||||
| 	{ | ||||
| 		if (isInvul()) | ||||
| 		{ | ||||
| @@ -889,24 +895,31 @@ public class PlayerInstance extends Creature | ||||
| 		} | ||||
| 		 | ||||
| 		// Damage message. | ||||
| 		final SystemMessage smsg = new SystemMessage(SystemMessage.S1_GAVE_YOU_S2_DMG); | ||||
| 		if ((attacker instanceof MonsterInstance) || (attacker instanceof NpcInstance)) | ||||
| 		if (sendMessage) | ||||
| 		{ | ||||
| 			final int mobId = ((NpcInstance) attacker).getNpcTemplate().getNpcId(); | ||||
| 			smsg.addNpcName(mobId); | ||||
| 			final SystemMessage msg = new SystemMessage(SystemMessage.S1_GAVE_YOU_S2_DMG); | ||||
| 			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()) | ||||
| 		{ | ||||
| 			return; | ||||
| 		} | ||||
| 		 | ||||
| 		// Stop water task. | ||||
| 		stopWaterTask(); | ||||
| 		 | ||||
| 		// Calculate Karma lost. | ||||
| 		if (getKarma() > 0) | ||||
| 		{ | ||||
| @@ -921,12 +934,17 @@ public class PlayerInstance extends Creature | ||||
| 					getInventory().dropItem(item, 1); | ||||
| 				} | ||||
| 			} | ||||
| 			decreaseKarma(); | ||||
| 			 | ||||
| 			// Not self inflicted damage. | ||||
| 			if (attacker != this) | ||||
| 			{ | ||||
| 				decreaseKarma(); | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		// Died from player. | ||||
| 		final PlayerInstance killer = attacker.getActingPlayer(); | ||||
| 		if (killer != null) | ||||
| 		if ((killer != null) && (killer != this)) | ||||
| 		{ | ||||
| 			if (_pvpFlag > 0) | ||||
| 			{ | ||||
| @@ -936,7 +954,6 @@ public class PlayerInstance extends Creature | ||||
| 			else if (_karma == 0) | ||||
| 			{ | ||||
| 				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 | ||||
| 	public PlayerInstance getActingPlayer() | ||||
| 	{ | ||||
|   | ||||
| @@ -20,6 +20,7 @@ package org.l2jmobius.gameserver.network.clientpackets; | ||||
| import java.io.IOException; | ||||
|  | ||||
| import org.l2jmobius.gameserver.Announcements; | ||||
| import org.l2jmobius.gameserver.data.MapRegionTable; | ||||
| import org.l2jmobius.gameserver.managers.GmListManager; | ||||
| import org.l2jmobius.gameserver.model.Clan; | ||||
| 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.ShortCutInit; | ||||
| import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; | ||||
| import org.l2jmobius.gameserver.network.serverpackets.TeleportToLocation; | ||||
| import org.l2jmobius.gameserver.network.serverpackets.UserInfo; | ||||
|  | ||||
| public class EnterWorld extends ClientBasePacket | ||||
| @@ -91,6 +93,29 @@ public class EnterWorld extends ClientBasePacket | ||||
| 		} | ||||
| 		World.getInstance().addVisibleObject(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) | ||||
|   | ||||
| @@ -41,6 +41,13 @@ public class Logout extends ClientBasePacket | ||||
| 				player.sendPacket(new ActionFailed()); | ||||
| 				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(); | ||||
| 			client.getConnection().sendPacket(ql); | ||||
| 			player.deleteMe(); | ||||
|   | ||||
| @@ -18,6 +18,7 @@ | ||||
| package org.l2jmobius.gameserver.network.clientpackets; | ||||
|  | ||||
| import org.l2jmobius.gameserver.enums.CreatureState; | ||||
| import org.l2jmobius.gameserver.model.World; | ||||
| import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; | ||||
| import org.l2jmobius.gameserver.network.ClientThread; | ||||
| import org.l2jmobius.gameserver.network.serverpackets.ActionFailed; | ||||
| @@ -49,12 +50,20 @@ public class MoveBackwardToLocation extends ClientBasePacket | ||||
| 				activeChar.sendPacket(ac); | ||||
| 				activeChar.broadcastPacket(ac); | ||||
| 			} | ||||
| 			 | ||||
| 			activeChar.setInCombat(false); | ||||
| 			activeChar.setCurrentState(CreatureState.IDLE); | ||||
| 			activeChar.setX(originX); | ||||
| 			activeChar.setY(originY); | ||||
| 			activeChar.setZ(originZ); | ||||
| 			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 | ||||
|  * 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()); | ||||
| 				return; | ||||
| 			} | ||||
| 			if (player.isInWater() && (player.getZ() > -16000)) | ||||
| 			{ | ||||
| 				player.sendMessage("You cannot exit the game under water."); | ||||
| 				player.sendPacket(new ActionFailed()); | ||||
| 				return; | ||||
| 			} | ||||
| 			 | ||||
| 			player.deleteMe(); | ||||
| 			final RestartResponse response = new RestartResponse(); | ||||
| 			client.getConnection().sendPacket(response); | ||||
|   | ||||
| @@ -92,6 +92,9 @@ public class ValidatePosition extends ClientBasePacket | ||||
| 				} | ||||
| 				activeChar.updateKnownCounter = 0; | ||||
| 			} | ||||
| 			 | ||||
| 			// Water check. | ||||
| 			activeChar.checkWaterState(); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 MobiusDevelopment
					MobiusDevelopment