package com.weem.epicinventor.actor; import com.weem.epicinventor.*; import com.weem.epicinventor.actor.monster.*; import com.weem.epicinventor.actor.oobaboo.*; import com.weem.epicinventor.armor.*; import com.weem.epicinventor.hud.*; import com.weem.epicinventor.inventory.*; import com.weem.epicinventor.network.*; import com.weem.epicinventor.particle.*; import com.weem.epicinventor.placeable.*; import com.weem.epicinventor.projectile.*; import com.weem.epicinventor.resource.*; import com.weem.epicinventor.utility.*; import com.weem.epicinventor.weapon.*; import com.weem.epicinventor.item.*; import java.io.*; import java.awt.*; import java.awt.image.*; import java.util.*; import java.awt.geom.AffineTransform; public class Player extends Actor implements Serializable { private static final long serialVersionUID = -606404122993560860L; private String name; private Inventory inventory; private ArmorType armorHead; private ArmorType armorChest; private ArmorType armorLegs; private ArmorType armorFeet; private int armorHeadLevel; private int armorChestLevel; private int armorLegsLevel; private int armorFeetLevel; private Robot robot; transient private Oobaboo oobaboo; transient private PlayerManager playerManager; private boolean isFallAnimating = false; private int selectedItem = 0; private boolean mouseClickHeld; private boolean invulnerable; private boolean invulnerableShow; private float invulnerableTotalTime; private final static float INVULNERABLE_MAX_TIME = 1.0f; transient private BufferedImage[] weaponImages = null; private boolean insideRobot; private int rezSicknessStack; private long rezSicknessEnd; transient private int fallBeforeAnimationChange = 32; transient private float fallDamageMultiplier = 2.5f; transient private final static int REZ_SICKNESS_TIME = 10 * 60 * 1000; transient private final static float REZ_SICKNESS_MULTIPLIER = 0.20f; transient private final static int INVENTORY_SIZE = 50; transient private final static int QB_INVENTORY_SIZE = 10; transient private final static int MOVE_SPEED = 8; transient private final static int MOVE_SPEED_INSIDE_ROBOT = 15; transient private final static int MOVE_SPEED_SLOWED = 4; transient private final static int JUMP_SIZE = 20; transient private final static int JUMP_SIZE_INSIDE_ROBOT = 30; transient private final static int MAX_INSIDE_ROBOT_DISTANCE = 24; transient private final static int BASE_HP_REGEN_RATE = 5; //percent of max per min private ResourceType currentResourceType; private long lastResourceSoundPlay; transient private String lowHPSound; transient private SoundClip lowHPSoundClip; transient private SoundClip weaponSoundClip; private float currentHPRegen; //partial hps private int currentHPRegenRate; //percent of max per min private float attackBonus; private boolean isTryingToFlap; private int xp; private int placingSlot = 0; transient private ParticleEmitter particleEmitter; private int currentRangedAnimationFrames; private int totalRangedAnimationFrames; private boolean tbAdded = false; transient boolean cameraReturning; transient public double cameraX, cameraY; transient public double cameraMoveSize = 0; transient public UDPKeys keyState; transient private UDPPlayer lastUDPUpdate; public Player() { super(null, null, "", 0, 0); } public Player(PlayerManager pm, Registry rg, String im, int x) { super(pm, rg, im, x, 0); playerManager = pm; inventory = new Inventory(rg, INVENTORY_SIZE); robot = new Robot(pm, this, rg, "Images/Robot/Standing", x); inventory.addToInventory(0, "ClothesChest", 1); playerEquipFromInventory(0); inventory.addToInventory(0, "ClothesLegs", 1); playerEquipFromInventory(0); inventory.addToInventory(0, "ClothesFeet", 1); playerEquipFromInventory(0); inventory.addToInventory(40, "Stick", 1); inventory.addToInventory(41, "Bread", 5); inventory.addToInventory(0, "Box", 1); inventory.addToInventory(0, "WoodBlock", 1); inventory.addToInventory(0, "Wood", 5); inventory.addToInventory(0, "StoneBlock", 1); inventory.addToInventory(0, "Stone", 5); inventory.addToInventory(0, "Copper", 2); inventory.addToInventory(0, "Silver", 1); resetPlayer(); } public void setPositionToSpawn() { Point townHallPoint = playerManager.getNearestTownHallXY(new Point(mapX, mapY)); mapX = townHallPoint.x; mapY = townHallPoint.y; if (mapX == 0) { mapX = 226; } if (mapY == 0) { mapY = playerManager.findFloor(mapX); } lastMapY = mapY; } public void setPositionToRandom() { do { Point randomPoint = new Point( Rand.getRange(0, registry.getBlockManager().getMapWidth() - width), Rand.getRange(0, registry.getBlockManager().getMapHeight() - height)); mapX = randomPoint.x; mapY = randomPoint.y; lastMapY = mapY; } while (playerManager.doesRectContainBlocks(mapX, mapY, width, height)); } public void resetPlayer() { setPositionToSpawn(); isStill = true; isTryingToMove = false; mouseClickHeld = false; facing = Facing.RIGHT; actionMode = ActionMode.NONE; vertMoveMode = VertMoveMode.NOT_JUMPING; topOffset = 10; baseOffset = 18; baseWidth = 24; jumpSize = 8; fallSize = 0; completeFall = 0; ascendOriginalSize = 6; ascendSize = 6; ascendMax = 48; xMoveSize = MOVE_SPEED; startJumpSize = JUMP_SIZE; knockBackX = 0; statusStun = false; hitPoints = baseHitPoints; weaponImages = new BufferedImage[12 * 2]; weaponImages[0] = null; updateArmorPoints(); updateHitPoints(); setInsideRobot(false); if (robot.isActive()) { robot.toggleActivated(mapX, mapY, true); } projectileOut = false; registry.setBossFight(false); } public void setTransient(Registry rg) { yx = new int[2]; ycm = new int[2]; if (armorHead != null) { if (armorHead.getArmorBonus() == null) { armorHead = Armor.getArmorType(armorHead.getName()); } } if (armorHeadLevel < 1) { armorHeadLevel = this.getLevel(); } if (armorChest != null) { if (armorChest.getArmorBonus() == null) { armorChest = Armor.getArmorType(armorChest.getName()); } } if (armorChestLevel < 1) { armorChestLevel = this.getLevel(); } if (armorLegs != null) { if (armorLegs.getArmorBonus() == null) { armorLegs = Armor.getArmorType(armorLegs.getName()); } } if (armorLegsLevel < 1) { armorLegsLevel = this.getLevel(); } if (armorFeet != null) { if (armorFeet.getArmorBonus() == null) { armorFeet = Armor.getArmorType(armorFeet.getName()); } } if (armorFeetLevel < 1) { armorFeetLevel = this.getLevel(); } playerManager = rg.getPlayerManager(); registry = rg; manager = rg.getPlayerManager(); fallDamageMultiplier = 2.5f; weaponImages = new BufferedImage[12 * 2]; weaponImages[0] = null; attackArcOffsetX = 0; attackArcOffsetY = 10; if (!playerManager.getCurrentPlayerSet()) { //set the current player if it hasn't been set. This is needed for setting the inventory levels properly playerManager.setCurrentPlayer(this); } robot.setTransient(rg, this); inventory.setTransient(rg); lowHPSound = null; lowHPSoundClip = null; if (id == null) { id = UUID.randomUUID().toString(); } } public void init() { Point townHallPoint = playerManager.getNearestTownHallXY(new Point(mapX, mapY)); mapX = townHallPoint.x; mapY = townHallPoint.y; if (mapX == 0) { mapX = 226; } if (mapY == 0) { mapY = playerManager.findFloor(mapX); } lastMapY = mapY; robot.init(); if (oobaboo != null) { oobaboo.init(); } } public void spawnOobaboo(String type) { registry.getResourceManager().stopNPCGather(this); if (type.equals("Healer")) { oobaboo = new OobabooHealer(playerManager, this, registry, "Images/Oobaboo/Healer/Standing", mapX); } else if (type.equals("Gatherer")) { oobaboo = new OobabooGatherer(playerManager, this, registry, "Images/Oobaboo/Gatherer/Standing", mapX); } else if (type.equals("Warrior")) { oobaboo = new OobabooWarrior(playerManager, this, registry, "Images/Oobaboo/Warrior/Standing", mapX); } if (registry.getGameController().multiplayerMode != registry.getGameController().multiplayerMode.NONE && registry.getNetworkThread() != null) { if (registry.getNetworkThread().readyForUpdates()) { registry.getNetworkThread().sendData(oobaboo); } } } public void oobabooDie() { oobaboo = null; } public boolean getCameraReturning() { return cameraReturning; } public void setCameraReturning(boolean r) { cameraReturning = r; if (cameraReturning) { cameraX = mapX; cameraY = mapY; cameraMoveSize = 0; } } public int getBaseOffset() { return baseOffset; } public int getXP() { return xp; } public int getLevel() { int[] xpTable = new int[21]; xpTable[0] = 0; xpTable[1] = 80; xpTable[2] = 245; xpTable[3] = 720; xpTable[4] = 1805; xpTable[5] = 3920; xpTable[6] = 7605; xpTable[7] = 13520; xpTable[8] = 22445; xpTable[9] = 35280; xpTable[10] = 53045; xpTable[11] = 76880; xpTable[12] = 108045; xpTable[13] = 147920; xpTable[14] = 198005; xpTable[15] = 259920; xpTable[16] = 335405; xpTable[17] = 426320; xpTable[18] = 534645; xpTable[19] = 662480; xpTable[20] = 812045; int level = 1; for (int i = 0; i < xpTable.length; i++) { //last level if (i == xpTable.length - 1) { return xpTable.length - 1; } if (xpTable[i] <= xp && xp < xpTable[i + 1]) { return (i + 1); } } return level; } public int getAttackBonus() { int level = this.getLevel(); int[] attackTable = new int[21]; attackTable[0] = 0; attackTable[1] = 8; attackTable[2] = 11; attackTable[3] = 16; attackTable[4] = 21; attackTable[5] = 27; attackTable[6] = 33; attackTable[7] = 39; attackTable[8] = 46; attackTable[9] = 53; attackTable[10] = 60; attackTable[11] = 67; attackTable[12] = 74; attackTable[13] = 81; attackTable[14] = 88; attackTable[15] = 96; attackTable[16] = 103; attackTable[17] = 110; attackTable[18] = 117; attackTable[19] = 125; attackTable[20] = 132; if (level > 0 && level <= attackTable.length) { return attackTable[level]; } else { return attackTable[1]; } } public void addXP(int x) { if (x > 0) { int oldLevel = getLevel(); int oldAttackBonus = getAttackBonus(); int oldHP = totalHitPoints; xp += x; if (xp > 812045) { xp = 812045; } updateHitPoints(); registry.getIndicatorManager().createXPIndicator(mapX + (width / 2), mapY + 50, "+" + Integer.toString(x) + "xp"); //check to see if we've leveled if (getLevel() > oldLevel && playerManager.getCurrentPlayer() == this) { //hp back to full hitPoints = totalHitPoints; //show level hud SoundClip cl = new SoundClip("Player/LevelUp"); registry.setAttackBonus(getAttackBonus() - oldAttackBonus); registry.setHPBonus(totalHitPoints - oldHP); registry.getHUDManager().loadHUD(HUDManager.HUDType.LevelUp); playerManager.showLevelUpGraphic(); } } if (registry.getGameController().multiplayerMode == registry.getGameController().multiplayerMode.SERVER && registry.getNetworkThread() != null) { if (registry.getNetworkThread().readyForUpdates()) { UpdatePlayer up = new UpdatePlayer(this.getId()); up.action = "AddXP"; up.dataInt = x; registry.getNetworkThread().sendData(up); } } } public void removeXP(int x, int mx, int my) { if (x > 0) { int oldXP = xp; int oldLevel = getLevel(); xp -= x; if (xp < 0) { xp = 0; } //make sure we didn't lose a level if (this.getLevel() < oldLevel) { xp = playerManager.getXPNeededForLevel(oldLevel); if (oldXP - xp > 0) { registry.getIndicatorManager().createNegativeXPIndicator(mapX + (width / 2), mapY + 50, "-" + Integer.toString(oldXP - xp) + "xp"); registry.getResourceManager().spawnXPCrystal(mx, my + 25, oldXP - xp); } } else if (oldXP != xp) { if (x > 0) { registry.getIndicatorManager().createNegativeXPIndicator(mapX + (width / 2), mapY + 50, "-" + Integer.toString(x) + "xp"); registry.getResourceManager().spawnXPCrystal(mx, my + 25, x); } } } } public boolean isPlayerPerformingAction() { if (actionMode == ActionMode.NONE) { return false; } else { return true; } } public Inventory getInventory() { return inventory; } @Override public void setFallSize(int fs) { fallSize = fs; robot.setFallSize(fs); } public int getInventorySize() { return INVENTORY_SIZE; } public int getStartJumpSize() { return startJumpSize; } public int playerAddItem(int startSlot, String name, int qty) { return inventory.addToInventory(startSlot, name, qty); } public int playerAddItem(int startSlot, String name, int qty, int level) { return inventory.addToInventory(startSlot, name, qty, level); } public String playerGetInventoryItemName(int slot) { return inventory.getNameFromSlot(slot); } public String playerGetInventoryItemCategory(int slot) { return inventory.getCategoryFromSlot(slot); } public int playerGetInventoryQty(int slot) { return inventory.getQtyFromSlot(slot); } public int playerGetInventoryLevel(int slot) { return inventory.getLevelFromSlot(slot); } public void playerDeleteInventory(int slot, int qty) { playerDeleteInventory(slot, qty, false); } public void playerDeleteInventory(int slot, int qty, boolean giveXP) { String itemName = inventory.getNameFromSlot(slot); int itemQty = inventory.getQtyFromSlot(slot); if (giveXP) { playerGiveItemXP(itemName, itemQty); } inventory.deleteInventory(slot, qty); } public void playerGiveItemXP(String itemName, int itemQty) { if (itemName != null) { if (registry.getGameController().multiplayerMode != registry.getGameController().multiplayerMode.CLIENT) { //give the player xp - xp table is built on the xp for a kill and then an item multiplier is applied SoundClip cl = new SoundClip("Player/Good"); this.addXP(getXPForItem(this.getLevel(), itemName) * itemQty); } if (registry.getGameController().multiplayerMode != registry.getGameController().multiplayerMode.NONE && registry.getNetworkThread() != null) { if (registry.getNetworkThread().readyForUpdates()) { UpdatePlayer up = new UpdatePlayer(this.getId()); up.name = this.getName(); up.action = "AddXP"; up.dataInt = getXPForItem(this.getLevel(), itemName) * itemQty; registry.getNetworkThread().sendData(up); } } } } public void setPlayerSlotQuantity(int slot, int qty) { inventory.setSlotQuantity(slot, qty); } @Override public void setShowRect(boolean r) { showRect = r; robot.setShowRect(r); } public boolean setInsideRobot(boolean i) { xMoveSize = MOVE_SPEED; startJumpSize = JUMP_SIZE; if (i && robot.getIsActivated()) { if (!insideRobot) { if (getCenterPoint().distance(robot.getCenterPoint()) <= MAX_INSIDE_ROBOT_DISTANCE) { SoundClip cl = new SoundClip(registry, "Robot/RideStart", getCenterPoint()); xMoveSize = MOVE_SPEED_INSIDE_ROBOT; startJumpSize = JUMP_SIZE_INSIDE_ROBOT; insideRobot = true; robot.stopAttacks(); robot.playerGettingInside(); if (particleEmitter != null) { particleEmitter.setActive(false); if (weaponSoundClip != null) { weaponSoundClip.stop(); } } return true; } } } else { if (insideRobot) { SoundClip cl = new SoundClip(registry, "Robot/RideStop", getCenterPoint()); insideRobot = false; return true; } } jumpSize = startJumpSize; return false; } public void scrollQuickBar(int steps) { handleReleased(null); selectedItem += steps; if (selectedItem < 0) { selectedItem = 0; } if (selectedItem >= QB_INVENTORY_SIZE) { selectedItem = QB_INVENTORY_SIZE - 1; } setPlayerSelectedItem(selectedItem); } public void setInventory(Inventory i) { inventory = i; } public void setPlayerSelectedItem(int i) { handleReleased(null); if (i >= 0 && i <= 9) { selectedItem = i; weaponImages[0] = null; } } public void setWeaponImages() { synchronized (this) { int slotIndex = selectedItem + INVENTORY_SIZE - QB_INVENTORY_SIZE; if (inventory.getTypeFromSlot(slotIndex).equals("Weapon")) { String imageName = inventory.getImageFromSlot(slotIndex); imageName = imageName.replace("Items/", "Weapons/"); BufferedImage weaponImage = registry.getImageLoader().getImage(imageName); if (weaponImage != null) { int angle = 0; for (int j = 0; j < 12; j++) { weaponImages[j] = weaponImage; angle = (int) ((float) j / 8.0f * 90.0f); AffineTransform at = new AffineTransform(); at.rotate(Math.toRadians(angle), weaponImages[j].getWidth() / 2, weaponImages[j].getHeight() / 2); AffineTransformOp atop = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); weaponImages[j] = atop.filter(weaponImages[j], null); } for (int j = 0; j < 12; j++) { weaponImages[j + 12] = weaponImage; AffineTransform tx = null; tx = AffineTransform.getScaleInstance(-1, 1); tx.translate(-1 * weaponImages[j + 12].getWidth(), 0); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); weaponImages[j + 12] = op.filter(weaponImages[j + 12], null); angle = (int) ((float) -j / 8.0f * 90.0f); AffineTransform at = new AffineTransform(); at.rotate(Math.toRadians(angle), weaponImages[j + 12].getWidth() / 2, weaponImages[j + 12].getHeight() / 2); AffineTransformOp atop = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); weaponImages[j + 12] = atop.filter(weaponImages[j + 12], null); } attackRange = weaponImage.getHeight() + 10; } } } } public void setName(String n) { name = n; if (!tbAdded) { if (name.toLowerCase().contains("total") && name.toLowerCase().contains("biscuit")) { inventory.addToInventory(39, "TBHead", 1); playerEquipFromInventory(39); tbAdded = true; } } } public void setRobotName(String n) { robot.setName(n); } public void setArmorTypeHead(String armorName, int l) { armorHead = Armor.getArmorType(armorName); armorHeadLevel = l; } public void setArmorTypeChest(String armorName, int l) { armorChest = Armor.getArmorType(armorName); armorChestLevel = l; } public void setArmorTypeLegs(String armorName, int l) { armorLegs = Armor.getArmorType(armorName); armorLegsLevel = l; } public void setArmorTypeFeet(String armorName, int l) { armorFeet = Armor.getArmorType(armorName); armorFeetLevel = l; } public void playerSwapInventory(int from, int to) { int slotIndex = selectedItem + INVENTORY_SIZE - QB_INVENTORY_SIZE; if (slotIndex == from || slotIndex == to) { weaponImages[0] = null; } inventory.swapInventoryLocations(from, to); } public void unEquip(String equipmentType) { if (equipmentType.equals("head")) { armorHead = null; armorHeadLevel = 0; } else if (equipmentType.equals("chest")) { armorChest = null; armorChestLevel = 0; } else if (equipmentType.equals("legs")) { armorLegs = null; armorLegsLevel = 0; } else if (equipmentType.equals("feet")) { armorFeet = null; armorFeetLevel = 0; } } public void playerUnEquipToInventory(String equipmentType, int to) { if (equipmentType.equals("head")) { if (playerAddItem(to, armorHead.getName(), 1, armorHeadLevel) == 0) { armorHead = null; armorHeadLevel = 0; } updateArmorPoints(); } else if (equipmentType.equals("chest")) { if (playerAddItem(to, armorChest.getName(), 1, armorChestLevel) == 0) { armorChest = null; armorChestLevel = 0; } updateArmorPoints(); } else if (equipmentType.equals("legs")) { if (playerAddItem(to, armorLegs.getName(), 1, armorLegsLevel) == 0) { armorLegs = null; armorLegsLevel = 0; } updateArmorPoints(); } else if (equipmentType.equals("feet")) { if (playerAddItem(to, armorFeet.getName(), 1, armorFeetLevel) == 0) { armorFeet = null; armorFeetLevel = 0; } updateArmorPoints(); } } public void playerUnEquipToDelete(String equipmentType) { if (equipmentType.equals("head")) { if (armorHead != null) { playerGiveItemXP(armorHead.getName(), 1); } armorHead = null; armorHeadLevel = 0; updateArmorPoints(); } else if (equipmentType.equals("chest")) { if (armorChest != null) { playerGiveItemXP(armorChest.getName(), 1); } armorChest = null; armorChestLevel = 0; updateArmorPoints(); } else if (equipmentType.equals("legs")) { if (armorLegs != null) { playerGiveItemXP(armorLegs.getName(), 1); } armorLegs = null; armorLegsLevel = 0; updateArmorPoints(); } else if (equipmentType.equals("feet")) { if (armorFeet != null) { playerGiveItemXP(armorFeet.getName(), 1); } armorFeet = null; armorFeetLevel = 0; updateArmorPoints(); } } public void playerCraftItem(String itemType) { boolean canCreate = false; ArrayList<String> requirements = playerManager.getItemTypeRequirements(itemType); //check to see if we have the needed materials if (requirements != null) { canCreate = true; for (int i = 0; i < requirements.size(); i++) { String[] parts = requirements.get(i).toString().split(":"); if (parts.length == 2) { HUDArea hudArea; int qtyOnHand = inventory.getItemTypeQty(parts[0]); int qtyNeeded = Integer.parseInt(parts[1]); boolean isPlaceable = false; ItemType it = registry.getItemType(parts[0]); if (it != null) { if (it.getCategory().equals("Placeable")) { isPlaceable = true; } } if (isPlaceable) { if (registry.getPlaceableManager().getActivatedCount(parts[0]) <= 0) { canCreate = false; } } else { if (qtyOnHand < qtyNeeded) { canCreate = false; } } } } } if (canCreate) { int qty = registry.getItemType(itemType).getCreateQty(); int level = this.getLevel(); int levelCheck = Rand.getRange(1, 100); if (levelCheck > 90) { level += 3; } else if (levelCheck > 75) { level += 2; } else if (levelCheck > 50) { level += 1; } if (level < 1) { level = 1; } if (level > 20) { level = 20; } //we have the needed materials, try to add to inventory if (inventory.addToInventory(0, itemType, qty, level) < qty) { SoundClip cl = new SoundClip("Player/Good"); //if successful, remove the needed materials for (int i = 0; i < requirements.size(); i++) { String[] parts = requirements.get(i).toString().split(":"); if (parts.length == 2) { ItemType it = registry.getItemType(parts[0]); if (!it.getCategory().equals("Placeable")) { inventory.deleteItems(parts[0], Integer.parseInt(parts[1])); } } } if (registry.getGameController().multiplayerMode != registry.getGameController().multiplayerMode.CLIENT) { //give the player xp - xp table is built on the xp for a kill and then an item multiplier is applied this.addXP(getXPForItem(this.getLevel(), itemType)); } } } } private int getXPForItem(int playerLevel, String itemName) { int[] xpTable = new int[31]; xpTable[0] = 0; xpTable[1] = 23; xpTable[2] = 32; xpTable[3] = 41; xpTable[4] = 52; xpTable[5] = 65; xpTable[6] = 79; xpTable[7] = 96; xpTable[8] = 114; xpTable[9] = 135; xpTable[10] = 157; xpTable[11] = 181; xpTable[12] = 206; xpTable[13] = 234; xpTable[14] = 263; xpTable[15] = 295; xpTable[16] = 328; xpTable[17] = 362; xpTable[18] = 399; xpTable[19] = 438; xpTable[20] = 478; xpTable[21] = 520; xpTable[22] = 564; xpTable[23] = 610; xpTable[24] = 657; xpTable[25] = 707; xpTable[26] = 758; xpTable[27] = 811; xpTable[28] = 866; xpTable[29] = 923; xpTable[30] = 981; //get the player xp - xp table is built on the xp for a kill and then an item multiplier is applied ItemType it = registry.getItemType(itemName); if (it != null && playerLevel >= 0 && playerLevel < xpTable.length) { float xp = registry.getItemType(itemName).getXPModifier(); xp *= (float) xpTable[playerLevel]; return (int) xp; } else { return 0; } } public void playerEquipFromInventory(int slot) { playerEquipFromInventory(slot, true); } public void playerEquipFromInventory(int slot, boolean changeInventory) { String type = inventory.getTypeFromSlot(slot); if (type.equals("Armor")) { String name = inventory.getNameFromSlot(slot); ArmorType newArmorType = Armor.getArmorType(name); if (newArmorType != null) { if (newArmorType.getType().equals("Head")) { if (armorHead == null) { //armor slot was previously empty - equip and remove from inv armorHead = newArmorType; armorHeadLevel = inventory.getLevelFromSlot(slot); if (changeInventory) { inventory.deleteInventory(slot, 0); } } else { //switching out armor for another ArmorType oldArmorType = armorHead; int oldArmorLevel = armorHeadLevel; armorHead = newArmorType; armorHeadLevel = inventory.getLevelFromSlot(slot); if (changeInventory) { inventory.deleteInventory(slot, 0); inventory.addToInventory(slot, oldArmorType.getName(), 1, oldArmorLevel); } } } else if (newArmorType.getType().equals("Chest")) { if (armorChest == null) { //armor slot was previously empty - equip and remove from inv armorChest = newArmorType; armorChestLevel = inventory.getLevelFromSlot(slot); if (changeInventory) { inventory.deleteInventory(slot, 0); } } else { //switching out armor for another ArmorType oldArmorType = armorChest; int oldArmorLevel = armorChestLevel; armorChest = newArmorType; armorChestLevel = inventory.getLevelFromSlot(slot); if (changeInventory) { inventory.deleteInventory(slot, 0); inventory.addToInventory(slot, oldArmorType.getName(), 1, oldArmorLevel); } } } else if (newArmorType.getType().equals("Legs")) { if (armorLegs == null) { //armor slot was previously empty - equip and remove from inv armorLegs = newArmorType; armorLegsLevel = inventory.getLevelFromSlot(slot); if (changeInventory) { inventory.deleteInventory(slot, 0); } } else { //switching out armor for another ArmorType oldArmorType = armorLegs; int oldArmorLevel = armorLegsLevel; armorLegs = newArmorType; armorLegsLevel = inventory.getLevelFromSlot(slot); if (changeInventory) { inventory.deleteInventory(slot, 0); inventory.addToInventory(slot, oldArmorType.getName(), 1, oldArmorLevel); } } } else if (newArmorType.getType().equals("Feet")) { if (armorFeet == null) { //armor slot was previously empty - equip and remove from inv armorFeet = newArmorType; armorFeetLevel = inventory.getLevelFromSlot(slot); if (changeInventory) { inventory.deleteInventory(slot, 0); } } else { //switching out armor for another ArmorType oldArmorType = armorFeet; int oldArmorLevel = armorFeetLevel; armorFeet = newArmorType; armorFeetLevel = inventory.getLevelFromSlot(slot); if (changeInventory) { inventory.deleteInventory(slot, 0); inventory.addToInventory(slot, oldArmorType.getName(), 1, oldArmorLevel); } } } updateArmorPoints(); } } } private void updateArmorPoints() { int newArmorPoints = baseArmorPoints; int[] bonuses; if (armorHead != null) { bonuses = armorHead.getArmorBonus(); newArmorPoints += bonuses[armorHeadLevel]; } if (armorChest != null) { bonuses = armorChest.getArmorBonus(); newArmorPoints += bonuses[armorChestLevel]; } if (armorLegs != null) { bonuses = armorLegs.getArmorBonus(); newArmorPoints += bonuses[armorLegsLevel]; } if (armorFeet != null) { bonuses = armorFeet.getArmorBonus(); newArmorPoints += bonuses[armorFeetLevel]; } armorPoints = newArmorPoints; } private void updateHitPoints() { int level = this.getLevel(); int[] hpTable = new int[31]; hpTable[0] = 0; hpTable[1] = 50; hpTable[2] = 100; hpTable[3] = 150; hpTable[4] = 200; hpTable[5] = 250; hpTable[6] = 300; hpTable[7] = 350; hpTable[8] = 400; hpTable[9] = 450; hpTable[10] = 500; hpTable[11] = 550; hpTable[12] = 600; hpTable[13] = 650; hpTable[14] = 700; hpTable[15] = 750; hpTable[16] = 800; hpTable[17] = 850; hpTable[18] = 900; hpTable[19] = 950; hpTable[20] = 1000; if (level > 0 && level <= hpTable.length) { totalHitPoints = hpTable[level]; } else { totalHitPoints = hpTable[1]; } baseHitPoints = totalHitPoints; if (hitPoints > totalHitPoints) { hitPoints = totalHitPoints; } } public int getMeleeRecastPercentage() { int percentage = 0; float total = attackRefreshTimerEnd - attackRefreshTimerStart; if (total > 0) { float current = System.currentTimeMillis() - attackRefreshTimerStart; float diff = (current / total) * 100f; percentage = (int) diff; if (percentage < 0) { percentage = 0; } if (percentage >= 100) { percentage = 0; } } return percentage; } public String getName() { return name; } public ArmorType getArmorTypeHead() { return armorHead; } public ArmorType getArmorTypeChest() { return armorChest; } public ArmorType getArmorTypeLegs() { return armorLegs; } public ArmorType getArmorTypeFeet() { return armorFeet; } public int getArmorTypeHeadLevel() { return armorHeadLevel; } public int getArmorTypeChestLevel() { return armorChestLevel; } public int getArmorTypeLegsLevel() { return armorLegsLevel; } public int getArmorTypeFeetLevel() { return armorFeetLevel; } public boolean getInsideRobot() { return insideRobot; } public int getHitPointPercentage() { float percentage = (float) hitPoints / (float) totalHitPoints; percentage = percentage * 100; return (int) percentage; } public void addHitPoints(int hp) { hitPoints += hp; if (hitPoints > totalHitPoints) { hitPoints = totalHitPoints; } } public int getRobotBatteryPercentage() { return robot.getBatteryPercentage(); } public Oobaboo getOobaboo() { return oobaboo; } public void setOobaboo(Oobaboo o) { o.setTransient(registry, this); oobaboo = o; } public Robot getRobot() { return robot; } public String getRobotMode() { return robot.getMode(); } public boolean getRobotFollowing() { return robot.getIsFollowing(); } public Inventory getRobotInventory() { return robot.getInventory(); } public int getRobotInventorySize() { return robot.getInventorySize(); } public boolean isRobotActivated() { return robot.getIsActivated(); } public int getSelectedItem() { return selectedItem; } public boolean isPlayerMoving() { if (isStill && vertMoveMode == VertMoveMode.NOT_JUMPING) { return false; } else { return true; } } public void startGather(String rt) { actionMode = ActionMode.GATHERING; currentResourceType = playerManager.getResourceTypeByResourceId(rt); } @Override public void jump() { if (!statusStun && !cameraReturning) { if (insideRobot && robot.getInventory().contains("Propeller") && vertMoveMode != VertMoveMode.JUMPING && vertMoveMode != VertMoveMode.NOT_JUMPING) { flap(); } else if (vertMoveMode == VertMoveMode.NOT_JUMPING) { setVertMoveMode(VertMoveMode.JUMPING); jumpSize = startJumpSize; if (armorFeet == null) { SoundClip cl = new SoundClip("Player/Jump" + Rand.getRange(1, 3)); } else { if (armorFeet.getName().equals("SpringFeet") && !insideRobot) { SoundClip cl = new SoundClip("Player/JumpSpring" + Rand.getRange(1, 3)); } else { SoundClip cl = new SoundClip("Player/Jump" + Rand.getRange(1, 3)); } } } } } public void npcDoneCollecting() { if (oobaboo != null) { oobaboo.setActionMode(ActionMode.NONE); } } public void stopGather() { actionMode = ActionMode.NONE; currentResourceType = null; } public void attack(Point clickPoint) { if (actionMode != ActionMode.ATTACKING && attackRefreshTimerEnd < System.currentTimeMillis()) { if (registry.getPlayerSelectedItemType(this).equals("Weapon")) { String itemName = registry.getPlayerSelectedItemName(this); WeaponType newWeaponType = Weapon.getWeaponType(itemName); if (newWeaponType != null) { if (newWeaponType.getType().equals("Melee")) { playerManager.stopActions(this); meleeAttack(newWeaponType, registry.getPlayerSelectedItemLevel(this)); } else if (newWeaponType.getType().equals("Ranged")) { playerManager.stopActions(this); rangedAttack(newWeaponType, registry.getPlayerSelectedItemLevel(this), clickPoint); } } } } mouseClickHeld = true; } @Override public void attack() { attack(null); } public int getSelectedItemIndex() { return selectedItem + INVENTORY_SIZE - QB_INVENTORY_SIZE; } public int getPlacingSlot() { return placingSlot; } public void handleClick(Point clickPoint) { if (cameraReturning) { this.setCameraReturning(false); } if (!insideRobot && !statusStun) { if (registry.getPlayerSelectedItemType(this).equals("Weapon")) { attack(clickPoint); } else if (inventory.getCategoryFromSlot(getSelectedItemIndex()).equals("Placeable")) { if (!playerManager.currentlyPlacing() && playerManager.getCurrentPlayer() == this && !isPlayerMoving()) { if (playerManager.playerStandingOnTownBlocks() || inventory.getNameFromSlot(getSelectedItemIndex()).equals("TownBlock")) { placingSlot = getSelectedItemIndex(); playerManager.loadPlaceable(inventory.getNameFromSlot(placingSlot), mapX + baseOffset, mapY); } else { registry.showMessage("Error", "You must be standing on a base to place an object"); } } } else if (inventory.getTypeFromSlot(getSelectedItemIndex()).equals("Animal")) { if (registry.getPlayerSelectedItemName(this).equals("Pig")) { SoundClip cl = new SoundClip(registry, "Monster/DiePig", getCenterPoint()); Monster m = registry.getMonsterManager().spawn("Pig", "Roaming", mapX, mapY); m.setPosition(mapX, mapY); playerManager.playerDeleteInventory(registry.getPlayerSelectedItemSlotIndex(this), 1); } } else if (inventory.getTypeFromSlot(getSelectedItemIndex()).equals("Usable")) { if (registry.getPlayerSelectedItemName(this).equals("Compass")) { SoundClip cl = new SoundClip(registry, "Misc/Teleport", getCenterPoint()); setPositionToSpawn(); } else if (registry.getPlayerSelectedItemName(this).equals("BrokenMirror")) { SoundClip cl = new SoundClip(registry, "Misc/Teleport", getCenterPoint()); setPositionToRandom(); } else if (registry.getPlayerSelectedItemName(this).equals("Idol")) { if (this == playerManager.getCurrentPlayer()) { playerManager.playerDeleteInventory(registry.getPlayerSelectedItemSlotIndex(this), 1); playerManager.showOobabooHUD(); SoundClip cl = new SoundClip(registry, "Oobaboo/Appear", getCenterPoint()); } } } else if (inventory.getTypeFromSlot(getSelectedItemIndex()).equals("Consumable")) { if (hitPoints >= baseHitPoints) { registry.showMessage("Error", "You already have full hitpoints"); } else { boolean consumed = false; if (registry.getPlayerSelectedItemName(this).equals("Bacon")) { addHitPoints((int) (((float) totalHitPoints / 100f) * 20f)); consumed = true; } else if (registry.getPlayerSelectedItemName(this).equals("Bread")) { addHitPoints((int) (((float) totalHitPoints / 100f) * 30f)); consumed = true; } else if (registry.getPlayerSelectedItemName(this).equals("Pumpkin")) { addHitPoints((int) (((float) totalHitPoints / 100f) * 60f)); consumed = true; } else if (registry.getPlayerSelectedItemName(this).equals("TulipSandwich")) { addHitPoints((int) (((float) totalHitPoints / 100f) * 75f)); consumed = true; registry.getMonsterManager().spawnBossOrc(this); } if (consumed) { playerManager.playerDeleteInventory(registry.getPlayerSelectedItemSlotIndex(this), 1); SoundClip cl = new SoundClip(registry, "Player/Eat" + Rand.getRange(1, 2), getCenterPoint()); } } } mouseClickHeld = true; } } public void handleRightClick() { playerManager.cancelPlaceable(this); } public void handleReleased(Point clickPoint) { mouseClickHeld = false; updateImage(); if (particleEmitter != null) { particleEmitter.setActive(false); if (weaponSoundClip != null) { weaponSoundClip.stop(); } } } @Override public void meleeAttack(WeaponType newWeaponType, int level) { if (newWeaponType != null) { Point mapPoint = new Point(registry.getMouseMapPosition()); actionMode = ActionMode.ATTACKING; currentAttackType = AttackType.MELEE; attackRefreshTimerStart = System.currentTimeMillis(); attackRefreshTimerEnd = System.currentTimeMillis() + newWeaponType.getSpeed(); attackArc = getAttackArc(); int kbX = newWeaponType.getKnockBackX(); if (facing == Facing.LEFT) { kbX = -1 * kbX; } int[] damages = newWeaponType.getDamage(); int damage = (int) ((float) damages[level] + this.getAttackBonus()); damage -= (int) ((float) damage * (REZ_SICKNESS_MULTIPLIER * (float) rezSicknessStack)); if (damage <= 0) { damage = 1; } ArrayList<String> monstersHit = playerManager.attackDamageAndKnockBack(this, attackArc, mapPoint, damage, kbX, newWeaponType.getKnockBackY(), newWeaponType.getMaxHits(), newWeaponType.getItemName()); if (monstersHit.contains("Pig") && newWeaponType.getItemName().equals("Net")) { this.playerAddItem(0, "Pig", 1); } } } public void rangedAttack(WeaponType newWeaponType, int level, Point clickPoint) { if (newWeaponType != null && clickPoint != null) { actionMode = ActionMode.ATTACKING; currentAttackType = AttackType.RANGE; attackRefreshTimerStart = System.currentTimeMillis(); attackRefreshTimerEnd = System.currentTimeMillis() + newWeaponType.getSpeed(); int[] damages = newWeaponType.getDamage(); int damage = (int) ((float) damages[level] + this.getAttackBonus()); damage -= (int) ((float) damage * (REZ_SICKNESS_MULTIPLIER * (float) rezSicknessStack)); if (damage <= 0) { damage = 1; } totalRangedAnimationFrames = newWeaponType.getAnimationFrames(); if (newWeaponType.getItemName().equals("FlameCannon")) { if (!mouseClickHeld && particleEmitter != null) { particleEmitter.destroy(); particleEmitter = null; } setFlameCannon(damages[level]); } else { String projectileType = "Arrow"; int projectileSpeed = 20; boolean projectileShoot = true; if (newWeaponType.getItemName().equals("Boomerang")) { projectileType = "Boomerang"; projectileSpeed = 12; if (projectileOut) { projectileShoot = false; } else { projectileOut = true; } if (projectileShoot) { Projectile p = registry.getProjectileManager().createReturningProjectile(this, projectileType, projectileSpeed, new Point( this.getMapX() + baseOffset + spriteRect.width / 2, this.getMapY() + spriteRect.height / 2), new Point( playerManager.panelToMapX(clickPoint.x), playerManager.panelToMapY(clickPoint.y)), true, false, false, damage); p.setSpinning("Boomerang"); p.setSound("Projectile/Boomerang", true); } } else { if (newWeaponType.getItemName().equals("SlingShot")) { projectileType = "Pebble"; } else if (newWeaponType.getItemName().equals("HandCannon")) { projectileType = "Bullet"; } else if (newWeaponType.getItemName().equals("AutoHandCannon")) { projectileType = "Bullet"; damage = (int) ((float) damages[level] + (this.getAttackBonus() / 4)); damage -= (int) ((float) damage * (REZ_SICKNESS_MULTIPLIER * (float) rezSicknessStack)); if (damage <= 0) { damage = 1; } } registry.getProjectileManager().createProjectile(this, projectileType, projectileSpeed, new Point( this.getMapX() + baseOffset + spriteRect.width / 2, this.getMapY() + spriteRect.height / 2), new Point( playerManager.panelToMapX(clickPoint.x), playerManager.panelToMapY(clickPoint.y)), true, false, false, damage); } } } } public void stopJump() { if (vertMoveMode == VertMoveMode.JUMPING) { setVertMoveMode(VertMoveMode.FALLING); setFallSize(0); } } public void stopAscend() { if (vertMoveMode == VertMoveMode.FLYING) { setVertMoveMode(VertMoveMode.FALLING); } } public void robotSetMode(String m) { robot.setMode(m); } public void robotToggleActivated() { robot.toggleActivated(mapX, mapY, false); } public void robotToggleFollow() { robot.toggleFollow(); } public int getAdjustedDamage(int damage) { damage = (int) ((float) damage * (1f + (REZ_SICKNESS_MULTIPLIER * (float) rezSicknessStack))); damage -= Math.floor(getArmorPoints() / 5); return damage; } public int getTotalHitPoints() { return totalHitPoints; } @Override public int applyDamage(int damage, Actor a) { if (insideRobot) { return 0; } else { if (damage <= 0) { return 0; } damage = getAdjustedDamage(damage); registerAttacker(a, damage); if (damage <= 0) { damage = 1; } if (damage > 0) { SoundClip cl = new SoundClip("Player/Hurt" + Rand.getRange(1, 5)); registry.getIndicatorManager().createIndicator(mapX + (width / 2), mapY + 50, "-" + Integer.toString(damage)); if (hitPoints - damage < 0) { hitPoints = 0; } else { hitPoints -= damage; } invulnerable = true; playerManager.stopActions(this); } } if (registry.getGameController().multiplayerMode == registry.getGameController().multiplayerMode.SERVER && registry.getNetworkThread() != null) { if (registry.getNetworkThread().readyForUpdates()) { UpdatePlayer up = new UpdatePlayer(this.getId()); up.action = "ApplyDamage"; up.dataInt = damage; up.actor = a; registry.getNetworkThread().sendData(up); } } return damage; } @Override protected void setStatuses() { super.setStatuses(); statusHeal = false; if (currentHPRegenRate > BASE_HP_REGEN_RATE) { statusHeal = true; } } public boolean getIsTryingToFly() { return isTryingToMove; } public void playerStopLoopingSound() { if (lowHPSoundClip != null) { lowHPSoundClip.stop(); lowHPSoundClip = null; } if (lowHPSoundClip != null) { lowHPSoundClip.stop(); lowHPSoundClip = null; } } /* * public void setIsTryingToFlap(boolean f) { up.vertMoveMode = * this.getVertMoveMode(); if (f != isTryingToFlap) { if * (registry.getGameController().multiplayerMode == * registry.getGameController().multiplayerMode.CLIENT && * registry.getNetworkThread() != null) { if * (registry.getNetworkThread().readyForUpdates()) { UpdatePlayer up = new * UpdatePlayer(this.getId()); up.mapX = this.getMapX(); up.mapY = * this.getMapY(); up.vertMoveMode = this.getVertMoveMode(); up.action = * "SetIsTryingToFlap"; registry.getNetworkThread().sendData(up); } } } * isTryingToFlap = f; } */ @Override public void flap() { if (vertMoveMode != VertMoveMode.FLYING) { setVertMoveMode(VertMoveMode.FLYING); } } @Override public void update() { if (weaponImages[0] == null) { setWeaponImages(); } super.update(); updateArmorPoints(); if (vertMoveMode == vertMoveMode.NOT_JUMPING && !insideRobot) { startJumpSize = JUMP_SIZE; if (armorFeet != null) { if (armorFeet.getName().equals("SpringFeet")) { startJumpSize = JUMP_SIZE_INSIDE_ROBOT; } } jumpSize = startJumpSize; } boolean attackingRanged = false; if (insideRobot) { xMoveSize = MOVE_SPEED_INSIDE_ROBOT; } else if (isSlowed) { xMoveSize = MOVE_SPEED_SLOWED; } else { xMoveSize = MOVE_SPEED; } //allows you to fly with propeller while holding space if (insideRobot && robot.getInventory().contains("Propeller") && !statusStun) { if (vertMoveMode != VertMoveMode.JUMPING && vertMoveMode != VertMoveMode.NOT_JUMPING) { if (playerManager.isKeyDown(Settings.buttonJump)) { //EIError.debugMsg("Update: Flap"); flap(); } } } //update animation if (isActive && isAnimating && actionMode == ActionMode.ATTACKING) { currentAnimationFrame++; if (currentAnimationFrame >= 12) { currentAnimationFrame = 0; actionMode = ActionMode.NONE; updateImage(); } } else if (isActive && isAnimating) { if (animationFrameUpdateTime <= registry.currentTime) { currentAnimationFrame++; if (currentAnimationFrame >= numAnimationFrames) { currentAnimationFrame = 0; } animationFrameUpdateTime = registry.currentTime + animationFrameDuration; } } if (registry.getGameController().multiplayerMode != registry.getGameController().multiplayerMode.CLIENT) { //update position if (!statusStun) { if (knockBackX > 0) { mapX += checkCollide(knockBackX); } else if (knockBackX < 0) { mapX -= checkCollide(knockBackX); } else { if (isTryingToMove) { if (facing == Facing.RIGHT) { mapX += checkCollideRight(); } else { mapX -= checkCollideLeft(); } } else if (vertMoveMode != VertMoveMode.NOT_JUMPING) { checkCollide(0); } } } //jumping/falling checks if (vertMoveMode == VertMoveMode.JUMPING) { updateJumping(); } else if (vertMoveMode == VertMoveMode.FLYING) { updateAscending(); } else if (vertMoveMode == VertMoveMode.FALLING) { updateFalling(); } //check to see if player is touching an enemy if (!invulnerable && registry.getGameController().multiplayerMode != registry.getGameController().multiplayerMode.CLIENT) { Damage damage = playerManager.getMonsterTouchDamage(spriteRect, getCenterPoint().x); if (damage != null) { int touchDamage = damage.getAmount(); if (touchDamage > 0) { applyDamage(touchDamage, damage.getSource()); if (damage.getKnockBackX() > 0 || damage.getKnockBackY() > 0) { applyKnockBack(damage.getKnockBackX(), damage.getKnockBackY()); } } } } } //check status of invulnerability if (invulnerable) { long p = registry.getImageLoader().getPeriod(); invulnerableTotalTime = (invulnerableTotalTime + registry.getImageLoader().getPeriod()) % (long) (1000 * INVULNERABLE_MAX_TIME * 2); if ((invulnerableTotalTime / (INVULNERABLE_MAX_TIME * 1000)) > 1) { invulnerable = false; invulnerableTotalTime = 0; } } mapX = playerManager.checkMapX(mapX, width); mapY = playerManager.checkMapY(mapY, height); if (registry.getGameController().multiplayerMode != registry.getGameController().multiplayerMode.CLIENT) { checkIfFalling(); } updateImage(); if (hitPoints <= 0) { setCameraReturning(true); BufferedImage im = null; if (isAnimating) { im = registry.getImageLoader().getImage(image, currentAnimationFrame); } else { im = registry.getImageLoader().getImage(image); } registry.getPixelizeManager().pixelize(im, mapX, mapY); Rectangle panelRect = playerManager.getPanelRect(); playerManager.playerDied(panelRect); int oldX = mapX; int oldY = mapY; resetPlayer(); if (oobaboo != null) { oobaboo.die(); oobaboo = null; } //take away 5% of xp float totalXPForCurrentLevel = 0; if (this.getLevel() > 1) { totalXPForCurrentLevel = playerManager.getXPNeededForLevel(this.getLevel() + 1) - playerManager.getXPNeededForLevel(this.getLevel()); } else { totalXPForCurrentLevel = playerManager.getXPNeededForLevel(this.getLevel() + 1); } this.removeXP((int) (totalXPForCurrentLevel * 0.05f), oldX, oldY); } if (this.getHitPointPercentage() >= 10 && this.getHitPointPercentage() <= 15) { if (lowHPSound != null) { if (!lowHPSound.equals("HeartBeatSlow")) { if (lowHPSoundClip != null) { lowHPSoundClip.stop(); } lowHPSound = "HeartBeatSlow"; lowHPSoundClip = new SoundClip("Player/" + lowHPSound); lowHPSoundClip.setLooping(true); } } else { lowHPSound = "HeartBeatSlow"; lowHPSoundClip = new SoundClip("Player/" + lowHPSound); lowHPSoundClip.setLooping(true); } } else if (this.getHitPointPercentage() >= 0 && this.getHitPointPercentage() <= 9) { if (lowHPSound != null) { if (!lowHPSound.equals("HeartBeatFast")) { if (lowHPSoundClip != null) { lowHPSoundClip.stop(); } lowHPSound = "HeartBeatFast"; lowHPSoundClip = new SoundClip("Player/" + lowHPSound); lowHPSoundClip.setLooping(true); } } else { lowHPSound = "HeartBeatFast"; lowHPSoundClip = new SoundClip("Player/" + lowHPSound); lowHPSoundClip.setLooping(true); } } else { if (lowHPSound != null) { if (!lowHPSound.isEmpty()) { if (lowHPSoundClip != null) { lowHPSoundClip.stop(); } lowHPSound = null; } } } if (robot != null) { robot.update(); } if (oobaboo != null) { oobaboo.update(); } if (particleEmitter != null) { if (facing == Actor.Facing.LEFT) { particleEmitter.setPosition(mapX, mapY + 30); } else { particleEmitter.setPosition(mapX + 55, mapY + 30); } particleEmitter.update(); } if (mouseClickHeld == true && attackRefreshTimerEnd < registry.currentTime && !insideRobot) { attack(registry.getMousePosition()); } if (registry.getGameController().multiplayerMode == registry.getGameController().multiplayerMode.CLIENT) { applyUpdate(); } if (this == playerManager.getCurrentPlayer()) { boolean showMiniMap = false; if (registry.getPlayerSelectedItemName(this).equals("CopperLocator")) { showMiniMap = true; registry.getHUDManager().updateResourceName("Copper"); } else if (registry.getPlayerSelectedItemName(this).equals("DiamondLocator")) { showMiniMap = true; registry.getHUDManager().updateResourceName("Diamond"); } else if (registry.getPlayerSelectedItemName(this).equals("EmeraldLocator")) { showMiniMap = true; registry.getHUDManager().updateResourceName("Emerald"); } else if (registry.getPlayerSelectedItemName(this).equals("GoldLocator")) { showMiniMap = true; registry.getHUDManager().updateResourceName("Gold"); } else if (registry.getPlayerSelectedItemName(this).equals("IronLocator")) { showMiniMap = true; registry.getHUDManager().updateResourceName("Iron"); } else if (registry.getPlayerSelectedItemName(this).equals("PlatinumLocator")) { showMiniMap = true; registry.getHUDManager().updateResourceName("Platinum"); } else if (registry.getPlayerSelectedItemName(this).equals("RubyLocator")) { showMiniMap = true; registry.getHUDManager().updateResourceName("Ruby"); } else if (registry.getPlayerSelectedItemName(this).equals("SapphireLocator")) { showMiniMap = true; registry.getHUDManager().updateResourceName("Sapphire"); } else if (registry.getPlayerSelectedItemName(this).equals("SilverLocator")) { showMiniMap = true; registry.getHUDManager().updateResourceName("Silver"); } if (showMiniMap) { registry.getHUDManager().showMiniMap(true); } else { registry.getHUDManager().showMiniMap(false); } } } public void updateLong() { if (registry.getGameController().multiplayerMode != registry.getGameController().multiplayerMode.CLIENT) { //calc HP regen rate currentHPRegenRate = BASE_HP_REGEN_RATE; currentHPRegenRate += registry.getPlaceableManager().getHPRegenerationBonus(getCenterPoint()); //regen some HP float hpToRegen = (getTotalHitPoints() / 100f) * (float) currentHPRegenRate; hpToRegen = hpToRegen / 60f; currentHPRegen += hpToRegen; if (currentHPRegen >= 1) { addHitPoints((int) currentHPRegen); currentHPRegen = 0; } //calc attack bonus statusAttackBonus = false; attackBonus = 1f + registry.getPlaceableManager().getAttackBonus(getCenterPoint()); if (attackBonus > 1) { statusAttackBonus = true; } //see if we have rez sickness statusRezSickness = false; if (rezSicknessStack > 0) { if (rezSicknessEnd <= System.currentTimeMillis()) { rezSicknessStack = 0; } if (rezSicknessStack > 0) { statusRezSickness = true; } } } if (oobaboo != null) { oobaboo.updateLong(); } } public void renderPlayer(Graphics g, int x, int y, boolean imageOverride) { BufferedImage im; String itemName = ""; int statusCount = 0; int statusX = 0; int statusNewXPos = 0; WeaponType newWeaponType = null; int xPos, yPos; int animationFrame = currentAnimationFrame; //draw springs if (armorFeet != null && vertMoveMode != VertMoveMode.NOT_JUMPING && !insideRobot) { if (armorFeet.getName().equals("SpringFeet")) { im = registry.getImageLoader().getImage("Player/Spring"); if (im != null) { if (vertMoveMode == VertMoveMode.FALLING && fallSize > startJumpSize) { xPos = manager.mapToPanelX(mapX + 23); yPos = manager.mapToPanelY(mapY + 5); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; g.drawImage(im, xPos, yPos, null); xPos = manager.mapToPanelX(mapX + 30); yPos = manager.mapToPanelY(mapY + 5); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; g.drawImage(im, xPos, yPos, null); } else if (vertMoveMode == VertMoveMode.JUMPING) { if (facing == Facing.RIGHT) { xPos = manager.mapToPanelX(mapX + 23); yPos = manager.mapToPanelY(mapY + 5); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; g.drawImage(im, xPos, yPos, null); xPos = manager.mapToPanelX(mapX + 30); yPos = manager.mapToPanelY(mapY + 8); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; g.drawImage(im, xPos, yPos, null); } else { xPos = manager.mapToPanelX(mapX + 23); yPos = manager.mapToPanelY(mapY + 8); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; g.drawImage(im, xPos, yPos, null); xPos = manager.mapToPanelX(mapX + 30); yPos = manager.mapToPanelY(mapY + 5); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; g.drawImage(im, xPos, yPos, null); } } else { if (!isTryingToMove) { xPos = manager.mapToPanelX(mapX + 23); yPos = manager.mapToPanelY(mapY + 5); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; g.drawImage(im, xPos, yPos, null); xPos = manager.mapToPanelX(mapX + 30); yPos = manager.mapToPanelY(mapY + 5); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; g.drawImage(im, xPos, yPos, null); } else { if (animationFrame == 0) { xPos = manager.mapToPanelX(mapX + 23); yPos = manager.mapToPanelY(mapY + 5); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; g.drawImage(im, xPos, yPos, null); xPos = manager.mapToPanelX(mapX + 30); yPos = manager.mapToPanelY(mapY + 5); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; g.drawImage(im, xPos, yPos, null); } else { xPos = manager.mapToPanelX(mapX + 22); yPos = manager.mapToPanelY(mapY + 5); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; g.drawImage(im, xPos, yPos, null); xPos = manager.mapToPanelX(mapX + 32); yPos = manager.mapToPanelY(mapY + 6); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; g.drawImage(im, xPos, yPos, null); } } } } } } if (actionMode == ActionMode.ATTACKING || mouseClickHeld) { itemName = registry.getPlayerSelectedItemName(this); newWeaponType = Weapon.getWeaponType(itemName); if (newWeaponType != null) { if (newWeaponType.getType().equals("Ranged")) { isAnimating = true; animationFrame = 4; } } } if (imageOverride) { im = registry.getImageLoader().getImage("Player/Standing"); } else { if (isAnimating) { if (newWeaponType != null) { if (actionMode == ActionMode.ATTACKING && newWeaponType.getType().equals("Melee")) { animationFrame = animationFrame / 2; im = registry.getImageLoader().getImage(image, animationFrame); } else { im = registry.getImageLoader().getImage(image, animationFrame); } } else { im = registry.getImageLoader().getImage(image, animationFrame); } } else { im = registry.getImageLoader().getImage(image); } if (invulnerable) { if (invulnerableShow) { invulnerableShow = false; } else { invulnerableShow = true; im = null; } } } if (x > 0 || y > 0) { xPos = x; yPos = y; } else { xPos = playerManager.mapToPanelX(mapX); yPos = playerManager.mapToPanelY(mapY); //flip the yPos since drawing happens top down versus bottom up yPos = playerManager.getPHeight() - yPos; //subtract the height since points are bottom left and drawing starts from top left yPos -= height; } if (im != null) { if (facing == Facing.LEFT && !imageOverride) { AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx = AffineTransform.getScaleInstance(-1, 1); tx.translate(-width, 0); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); BufferedImage imLeft = op.filter(im, null); if (imLeft != null) { g.drawImage(imLeft, xPos, yPos, null); } } else { g.drawImage(im, xPos, yPos, null); } renderArmor(g, xPos, yPos, imageOverride, animationFrame); //render attack if ((actionMode == ActionMode.ATTACKING || mouseClickHeld) && !imageOverride && currentAttackType == AttackType.RANGE) { if (newWeaponType != null) { if (newWeaponType.getType().equals("Ranged")) { renderRangedAttack(g); } } } if (actionMode == ActionMode.ATTACKING && !imageOverride) { if (newWeaponType != null) { if (newWeaponType.getType().equals("Melee") && currentAttackType != AttackType.RANGE) { renderMeleeAttack(g, xPos, yPos); } } } } if (!imageOverride) { //render parachute? if (vertMoveMode == VertMoveMode.FALLING && fallSize > startJumpSize) { if (inventory.containsFromTop("Parachute", 10)) { xPos = manager.mapToPanelX(mapX - 7); yPos = manager.mapToPanelY(mapY + 40); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; //subtract the height since points are bottom left and drawing starts from top left yPos -= height; im = registry.getImageLoader().getImage("Player/Parachute"); if (im != null) { g.drawImage(im, xPos, yPos, null); } } } //render statuses if (statusAttackBonus) { statusCount++; } if (statusFear) { statusCount++; } if (statusHeal) { statusCount++; } if (statusPoison) { statusCount++; } if (statusRezSickness) { statusCount++; } if (statusStun) { statusCount++; } if (statusSlowed) { statusCount++; } if (statusCount > 0) { int totalWidth = (statusCount * STATUS_WIDTH) + ((statusCount - 1) * STATUS_SPACING); statusX = getCenterPoint().x - (totalWidth / 2); int i = 0; if (statusFear) { statusNewXPos = statusX + (i * STATUS_WIDTH) + (i * STATUS_SPACING); xPos = manager.mapToPanelX(statusNewXPos); yPos = manager.mapToPanelY(mapY + 30); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; //subtract the height since points are bottom left and drawing starts from top left yPos -= height; im = registry.getImageLoader().getImage("Effects/Fear"); if (im != null) { g.drawImage(im, xPos, yPos, null); } i++; } if (statusAttackBonus) { statusNewXPos = statusX + (i * STATUS_WIDTH) + (i * STATUS_SPACING); xPos = manager.mapToPanelX(statusNewXPos); yPos = manager.mapToPanelY(mapY + 30); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; //subtract the height since points are bottom left and drawing starts from top left yPos -= height; im = registry.getImageLoader().getImage("Effects/AttackBonus"); if (im != null) { g.drawImage(im, xPos, yPos, null); } i++; } if (statusHeal) { statusNewXPos = statusX + (i * STATUS_WIDTH) + (i * STATUS_SPACING); xPos = manager.mapToPanelX(statusNewXPos); yPos = manager.mapToPanelY(mapY + 30); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; //subtract the height since points are bottom left and drawing starts from top left yPos -= height; im = registry.getImageLoader().getImage("Effects/Heal"); if (im != null) { g.drawImage(im, xPos, yPos, null); } i++; } if (statusPoison) { statusNewXPos = statusX + (i * STATUS_WIDTH) + (i * STATUS_SPACING); xPos = manager.mapToPanelX(statusNewXPos); yPos = manager.mapToPanelY(mapY + 30); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; //subtract the height since points are bottom left and drawing starts from top left yPos -= height; im = registry.getImageLoader().getImage("Effects/Poison"); if (im != null) { g.drawImage(im, xPos, yPos, null); } i++; } if (statusRezSickness) { statusNewXPos = statusX + (i * STATUS_WIDTH) + (i * STATUS_SPACING); xPos = manager.mapToPanelX(statusNewXPos); yPos = manager.mapToPanelY(mapY + 30); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; //subtract the height since points are bottom left and drawing starts from top left yPos -= height; im = registry.getImageLoader().getImage("Effects/RezSickness"); if (im != null) { g.drawImage(im, xPos, yPos, null); } i++; } if (statusStun) { statusNewXPos = statusX + (i * STATUS_WIDTH) + (i * STATUS_SPACING); xPos = manager.mapToPanelX(statusNewXPos); yPos = manager.mapToPanelY(mapY + 30); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; //subtract the height since points are bottom left and drawing starts from top left yPos -= height; im = registry.getImageLoader().getImage("Effects/Stun"); if (im != null) { g.drawImage(im, xPos, yPos, null); } i++; } if (statusSlowed) { statusNewXPos = statusX + (i * STATUS_WIDTH) + (i * STATUS_SPACING); xPos = manager.mapToPanelX(statusNewXPos); yPos = manager.mapToPanelY(mapY + 30); //flip the yPos since drawing happens top down versus bottom up yPos = manager.getPHeight() - yPos; //subtract the height since points are bottom left and drawing starts from top left yPos -= height; im = registry.getImageLoader().getImage("Effects/Slowed"); if (im != null) { g.drawImage(im, xPos, yPos, null); } i++; } } } if (actionMode == ActionMode.GATHERING && animationFrame == 0 && currentResourceType != null) { if (registry.currentTime - lastResourceSoundPlay > 500) { //only play if we haven't played for at least a half second lastResourceSoundPlay = registry.currentTime; SoundClip cl = new SoundClip(registry, "Player/Gather" + currentResourceType.getType() + Rand.getRange(1, 3), getCenterPoint()); } } } public void renderMeleeAttack(Graphics g, int xPos, int yPos) { int[] offset = null; BufferedImage weaponImage = null; if (currentAnimationFrame < 12) { offset = getMeleeAttackRotateOffsets(weaponImages[0]); offset[0] += xPos; offset[1] += yPos; weaponImage = getMeleeAttackRotateImage(); g.drawImage(weaponImage, offset[0], offset[1], null); } } public void renderRangedAttack(Graphics g) { BufferedImage weaponImage = null; String itemName = registry.getPlayerSelectedItemName(this); if (totalRangedAnimationFrames > 1) { if (currentAnimationFrame != currentRangedAnimationFrames) { currentRangedAnimationFrames++; if (currentRangedAnimationFrames >= totalRangedAnimationFrames) { currentRangedAnimationFrames = 0; } } weaponImage = registry.getImageLoader().getImage("Weapons/" + itemName, currentRangedAnimationFrames); } else { weaponImage = registry.getImageLoader().getImage("Weapons/" + itemName); } if (weaponImage != null) { int xPos = playerManager.mapToPanelX(mapX); int yPos = playerManager.mapToPanelY(mapY); //flip the yPos since drawing happens top down versus bottom up yPos = playerManager.getPHeight() - yPos; //subtract the height since points are bottom left and drawing starts from top left yPos -= height; if (facing == Facing.LEFT) { AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx = AffineTransform.getScaleInstance(-1, 1); tx.translate(-width, 0); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); weaponImage = op.filter(weaponImage, null); } g.drawImage(weaponImage, xPos, yPos, null); } } private BufferedImage getMeleeAttackRotateImage() { BufferedImage weaponImage = null; if (facing == Facing.RIGHT) { weaponImage = weaponImages[currentAnimationFrame]; } else { weaponImage = weaponImages[currentAnimationFrame + 12]; } return weaponImage; } private int[] getMeleeAttackRotateOffsets(BufferedImage weaponImage) { int angle = 90 - (int) ((float) currentAnimationFrame / 8.0f * 90.0f); int[] offset = new int[2]; if (weaponImage != null) { offset[0] = -1 * weaponImage.getWidth() / 2 + 20; offset[1] = -1 * weaponImage.getHeight() / 2 + 34; if (facing == Facing.LEFT) { angle = 90 + (int) ((float) currentAnimationFrame / 8.0f * 90.0f); offset[0] += 20; } offset[0] += (int) ((weaponImage.getHeight() / 2 + 20) * Math.cos(Math.toRadians(angle))); offset[1] -= (int) ((weaponImage.getHeight() / 2 + 15) * Math.sin(Math.toRadians(angle))); } else { offset[0] = 0; offset[1] = 0; } return offset; } public void renderArmor(Graphics g, int xPos, int yPos, boolean imageOverride, int animationFrame) { BufferedImage im; //draw the feet armor if (armorFeet != null) { String armorImageName = armorFeet.getImageName(); if (imageOverride) { armorImageName += "/Standing"; im = registry.getImageLoader().getImage(armorImageName); } else { armorImageName += image.replace("Player/", "/"); if (isAnimating) { im = registry.getImageLoader().getImage(armorImageName, animationFrame); } else { im = registry.getImageLoader().getImage(armorImageName); } } if (im != null) { if (facing == Facing.LEFT && !imageOverride) { AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx = AffineTransform.getScaleInstance(-1, 1); tx.translate(-width, 0); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); BufferedImage imLeft = op.filter(im, null); if (imLeft != null) { g.drawImage(imLeft, xPos, yPos, null); } } else { g.drawImage(im, xPos, yPos, null); } } } //draw the legs armor if (armorLegs != null) { String armorImageName = armorLegs.getImageName(); if (imageOverride) { armorImageName += "/Standing"; im = registry.getImageLoader().getImage(armorImageName); } else { armorImageName += image.replace("Player/", "/"); if (isAnimating) { im = registry.getImageLoader().getImage(armorImageName, animationFrame); } else { im = registry.getImageLoader().getImage(armorImageName); } } if (im != null) { if (facing == Facing.LEFT && !imageOverride) { AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx = AffineTransform.getScaleInstance(-1, 1); tx.translate(-width, 0); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); BufferedImage imLeft = op.filter(im, null); if (imLeft != null) { g.drawImage(imLeft, xPos, yPos, null); } } else { g.drawImage(im, xPos, yPos, null); } } } //draw the chest armor if (armorChest != null) { String armorImageName = armorChest.getImageName(); if (imageOverride) { armorImageName += "/Standing"; im = registry.getImageLoader().getImage(armorImageName); } else { armorImageName += image.replace("Player/", "/"); if (isAnimating) { im = registry.getImageLoader().getImage(armorImageName, animationFrame); } else { im = registry.getImageLoader().getImage(armorImageName); } } if (im != null) { if (facing == Facing.LEFT && !imageOverride) { AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx = AffineTransform.getScaleInstance(-1, 1); tx.translate(-width, 0); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); BufferedImage imLeft = op.filter(im, null); if (imLeft != null) { g.drawImage(imLeft, xPos, yPos, null); } } else { g.drawImage(im, xPos, yPos, null); } } } //draw the head armor if (armorHead != null) { String armorImageName = armorHead.getImageName(); if (imageOverride) { armorImageName += "/Standing"; im = registry.getImageLoader().getImage(armorImageName); } else { armorImageName += image.replace("Player/", "/"); if (isAnimating) { im = registry.getImageLoader().getImage(armorImageName, animationFrame); } else { im = registry.getImageLoader().getImage(armorImageName); } } if (im != null) { if (facing == Facing.LEFT && !imageOverride) { AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx = AffineTransform.getScaleInstance(-1, 1); tx.translate(-width, 0); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); BufferedImage imLeft = op.filter(im, null); if (imLeft != null) { g.drawImage(imLeft, xPos, yPos, null); } } else { g.drawImage(im, xPos, yPos, null); } } } } @Override public void render(Graphics g) { if (!insideRobot) { renderPlayer(g, 0, 0, false); super.render(g); } if (robot != null) { robot.render(g); } if (oobaboo != null) { oobaboo.render(g); } FontMetrics fm = g.getFontMetrics(); int messageWidth = fm.stringWidth(name); int xPos = playerManager.mapToPanelX((int) mapX + (width / 2) - (messageWidth / 2)); int yPos = playerManager.mapToPanelY((int) mapY); yPos = playerManager.getPHeight() - yPos; Font textFont = new Font("SansSerif", Font.BOLD, 14); g.setFont(textFont); registry.ghettoOutline(g, Color.BLACK, name, xPos, yPos - 60); g.setColor(Color.white); g.drawString(name, xPos, yPos - 60); /* * if (attackArc != null) { int xPos = * manager.mapToPanelX((int)attackArc.x); int yPos = * manager.mapToPanelY((int)attackArc.y); yPos = manager.getPHeight() - * yPos; yPos -= attackArc.height; g.setColor(Color.red); * g.drawArc(xPos, yPos, (int)attackArc.width, (int)attackArc.height, * (int)attackArc.start, (int)attackArc.extent); } */ if (particleEmitter != null) { particleEmitter.render(g); } } @Override protected void finishJumping() { if (registry.getGameController().multiplayerMode != registry.getGameController().multiplayerMode.CLIENT) { //if the player falls more than 20 pixels, start applying fall damage // fall damage goes to a max of 120 pixels where the user takes 100% damage if ((completeFall - startJumpSize) >= 20) { float percentage = (float) (completeFall - startJumpSize - 20) / 100f; if (insideRobot) { if (robot.getInventory().contains("Propeller")) { //no fall damage } else { robot.applyDamage((int) ((float) totalHitPoints * percentage), null); } } else { if (inventory.containsFromTop("Parachute", 10)) { //no fall damage } else { applyDamage((int) ((float) totalHitPoints * percentage), null); } } } } setVertMoveMode(VertMoveMode.NOT_JUMPING, false); robot.setVertMoveMode(VertMoveMode.NOT_JUMPING, false); totalFall = 0; fallSize = 0; knockBackX = 0; if (!isTryingToMove) { stopMove(); } else if (!image.equals("Player/Walking")) { if (facing == Facing.RIGHT) { moveRight(); } else { moveLeft(); } } isFallAnimating = false; } @Override protected void updateImage() { if (actionMode == ActionMode.ATTACKING || (mouseClickHeld && currentAttackType == AttackType.RANGE) && registry.getPlayerSelectedItemType(this).equals("Weapon")) { if (currentAnimationFrame == 0 || !image.equals("Player/Swinging")) { loopImage("Player/Swinging", 0.10f); } } else if (vertMoveMode == VertMoveMode.FALLING && fallSize > startJumpSize) { loopImage("Player/Falling"); } else if (vertMoveMode == VertMoveMode.JUMPING) { setImage("Player/Jumping"); } else { if (actionMode == ActionMode.GATHERING) { loopImage("Player/Gathering"); } else if (!isTryingToMove) { setImage("Player/Standing"); } else { loopImage("Player/Walking"); } } robot.setFacing(facing); //robot.setVertMoveMode(vertMoveMode); robot.setIsTryingToMove(isTryingToMove); } private void setFlameCannon(int damage) { if (particleEmitter == null) { ArrayList<String> images = new ArrayList<String>(); images.add("Particles/Flame1"); images.add("Particles/Flame2"); images.add("Particles/Flame3"); images.add("Particles/Flame4"); images.add("Particles/Flame5"); images.add("Particles/Flame6"); images.add("Particles/Flame7"); images.add("Particles/Flame8"); particleEmitter = new ParticleEmitter(registry.getGameController(), registry, this, mapX + 30, mapY + 50, images, true, false, true, 1, 10.0f, 10.0f, 400, true); particleEmitter.setParticlesPerGeneration(damage); if (weaponSoundClip != null) { weaponSoundClip.stop(); } weaponSoundClip = new SoundClip("Projectile/FlameCannon"); weaponSoundClip.setLooping(true); } else { particleEmitter.setActive(true); } } private void destoryParticleEmitter() { if (particleEmitter != null) { particleEmitter.destroy(); particleEmitter = null; if (weaponSoundClip != null) { weaponSoundClip.stop(); } } } public UDPRobot createRobotUpdate() { if (robot != null) { return robot.createUpdate(); } else { return null; } } public UDPOobaboo createOobabooUpdate() { if (oobaboo != null) { return oobaboo.createUpdate(); } else { return null; } } public UDPPlayer createUpdate() { UDPPlayer udpUpdate = new UDPPlayer(id); udpUpdate.mapX = mapX; udpUpdate.lastMapY = lastMapY; udpUpdate.mapY = mapY; udpUpdate.width = width; udpUpdate.height = height; udpUpdate.xMoveSize = xMoveSize; //udpUpdate.image = image; udpUpdate.actionMode = actionMode; udpUpdate.vertMoveMode = vertMoveMode; udpUpdate.facing = facing; udpUpdate.jumpSize = jumpSize; //udpUpdate.ascendOriginalSize = ascendOriginalSize; //udpUpdate.ascendSize = ascendSize; //udpUpdate.ascendCount = ascendCount; //udpUpdate.ascendMax = ascendMax; //udpUpdate.fallSize = fallSize; udpUpdate.isStill = isStill; udpUpdate.isTryingToMove = isTryingToMove; udpUpdate.startJumpSize = startJumpSize; //udpUpdate.maxFallSize = maxFallSize; //udpUpdate.gravity = gravity; //udpUpdate.totalFall = totalFall; //udpUpdate.completeFall = completeFall; udpUpdate.totalHitPoints = totalHitPoints; udpUpdate.hitPoints = hitPoints; udpUpdate.totalArmorPoints = totalArmorPoints; udpUpdate.armorPoints = armorPoints; udpUpdate.knockBackX = knockBackX; //udpUpdate.isDead = isDead; udpUpdate.armorHead = armorHead; udpUpdate.armorChest = armorChest; udpUpdate.armorLegs = armorLegs; udpUpdate.armorFeet = armorFeet; udpUpdate.armorHeadLevel = armorHeadLevel; udpUpdate.armorChestLevel = armorChestLevel; udpUpdate.armorLegsLevel = armorLegsLevel; udpUpdate.armorFeetLevel = armorFeetLevel; udpUpdate.selectedItem = selectedItem; udpUpdate.invulnerable = invulnerable; udpUpdate.insideRobot = insideRobot; udpUpdate.currentResourceType = currentResourceType; //udpUpdate.currentHPRegen = currentHPRegen; //udpUpdate.currentHPRegenRate = currentHPRegenRate; //udpUpdate.attackBonus = attackBonus; //udpUpdate.isTryingToFlap = isTryingToFlap; udpUpdate.xp = xp; if (this.robot.getIsActivated()) { udpUpdate.robotActive = true; } else { udpUpdate.robotActive = false; } if (this.oobaboo != null) { udpUpdate.oobabooActive = true; } else { udpUpdate.oobabooActive = false; } return udpUpdate; } public void processUpdate(UDPPlayer udpUpdate) { //used so we only process a single update packet per player update lastUDPUpdate = udpUpdate; } private void applyUpdate() { synchronized (this) { if (lastUDPUpdate != null) { //if we're moving and have skipped an update (moving more than possible per frame, just move once - we can catch up later) if (lastUDPUpdate.id == this.getId()) { if (Math.abs(lastUDPUpdate.mapX - mapX) > lastUDPUpdate.xMoveSize) { if (lastUDPUpdate.mapX > mapX) { mapX += lastUDPUpdate.xMoveSize; } else { mapX -= lastUDPUpdate.xMoveSize; } } else { mapX = lastUDPUpdate.mapX; } } else { mapX = lastUDPUpdate.mapX; } lastMapY = lastUDPUpdate.lastMapY; mapY = lastUDPUpdate.mapY; width = lastUDPUpdate.width; height = lastUDPUpdate.height; xMoveSize = lastUDPUpdate.xMoveSize; //image = lastUDPUpdate.image; actionMode = lastUDPUpdate.actionMode; vertMoveMode = lastUDPUpdate.vertMoveMode; facing = lastUDPUpdate.facing; jumpSize = lastUDPUpdate.jumpSize; //ascendOriginalSize = lastUDPUpdate.ascendOriginalSize; //ascendSize = lastUDPUpdate.ascendSize; //ascendCount = lastUDPUpdate.ascendCount; //ascendMax = lastUDPUpdate.ascendMax; //fallSize = lastUDPUpdate.fallSize; isStill = lastUDPUpdate.isStill; isTryingToMove = lastUDPUpdate.isTryingToMove; startJumpSize = lastUDPUpdate.startJumpSize; //maxFallSize = lastUDPUpdate.maxFallSize; //gravity = lastUDPUpdate.gravity; //totalFall = lastUDPUpdate.totalFall; //completeFall = lastUDPUpdate.completeFall; totalHitPoints = lastUDPUpdate.totalHitPoints; hitPoints = lastUDPUpdate.hitPoints; totalArmorPoints = lastUDPUpdate.totalArmorPoints; armorPoints = lastUDPUpdate.armorPoints; knockBackX = lastUDPUpdate.knockBackX; //isDead = lastUDPUpdate.isDead; armorHead = lastUDPUpdate.armorHead; armorChest = lastUDPUpdate.armorChest; armorLegs = lastUDPUpdate.armorLegs; armorFeet = lastUDPUpdate.armorFeet; armorHeadLevel = lastUDPUpdate.armorHeadLevel; armorChestLevel = lastUDPUpdate.armorChestLevel; armorLegsLevel = lastUDPUpdate.armorLegsLevel; armorFeetLevel = lastUDPUpdate.armorFeetLevel; selectedItem = lastUDPUpdate.selectedItem; invulnerable = lastUDPUpdate.invulnerable; insideRobot = lastUDPUpdate.insideRobot; currentResourceType = lastUDPUpdate.currentResourceType; //currentHPRegen = lastUDPUpdate.currentHPRegen; //currentHPRegenRate = lastUDPUpdate.currentHPRegenRate; //attackBonus = lastUDPUpdate.attackBonus; //isTryingToFlap = lastUDPUpdate.isTryingToFlap; xp = lastUDPUpdate.xp; if (lastUDPUpdate.robotActive) { robot.setIsActivated(true); } else { robot.setIsActivated(false); } if (!lastUDPUpdate.oobabooActive) { oobaboo = null; } //adjust mapX for clients to make movement more smooth //we're predicting where the player should be //and making adjustments if needed if (lastUDPUpdate.id == this.getId()) { if (!isStill) { int x = mapX; if (facing == Facing.RIGHT) { if (x == lastMapX) { x += xMoveSize; } else if (x < lastMapX) { x = lastMapX + xMoveSize; } } else if (facing == Facing.LEFT && registry.getGameController().isKeyDown(Settings.buttonMoveLeft)) { if (x == lastMapX) { x -= xMoveSize; } else if (mapX > lastMapX) { x = lastMapX - xMoveSize; } } if (x - mapX > 0) { mapX += checkCollide(x - mapX); } else { mapX -= checkCollide(x - mapX); } } } } lastUDPUpdate = null; lastMapX = mapX; } } private void readObject(ObjectInputStream aInputStream) throws Exception { aInputStream.defaultReadObject(); } private void writeObject(ObjectOutputStream aOutputStream) throws Exception { aOutputStream.defaultWriteObject(); } }