diff --git a/docs/mychanges_ptbr.txt b/docs/mychanges_ptbr.txt index 76bf3fa705..318d857b5d 100644 --- a/docs/mychanges_ptbr.txt +++ b/docs/mychanges_ptbr.txt @@ -1789,4 +1789,9 @@ Corrigido inserção de PIC errado no sistema anti-multicliente impossibilitando 04 Abril 2019, Corrigido comandos sem parâmetros contabilizando feed de "um parâmetro vazio". -Ajustado moderadamente drop rate de vários equipamentos na DB. \ No newline at end of file +Ajustado moderadamente drop rate de vários equipamentos na DB. + +06 Abril 2019, +Corrigido loot de party não funcionando adequadamente após updates recentes. +Implementado loot de party agora atualizando também loots de jogadores ao entrar numa party (pronta permissão de coleta de loots de outros membros da party). +Corrigido cooldown de skills de mob não atuando adequadamente. \ No newline at end of file diff --git a/src/client/MapleCharacter.java b/src/client/MapleCharacter.java index f3119ff66e..9b63d8fca1 100644 --- a/src/client/MapleCharacter.java +++ b/src/client/MapleCharacter.java @@ -1480,15 +1480,25 @@ public class MapleCharacter extends AbstractMapleCharacterObject { partyLeaver = this; } - int partyId = exPartyMembers != null ? 0 : this.getPartyId(); + MapleMap map = this.getMap(); + List partyItems = null; + + int partyId = exPartyMembers != null ? -1 : this.getPartyId(); for(WeakReference mapRef : mapids) { MapleMap mapObj = mapRef.get(); if(mapObj != null) { - mapObj.updatePlayerItemDrops(partyId, id, partyMembers, partyLeaver); + List partyMapItems = mapObj.updatePlayerItemDropsToParty(partyId, id, partyMembers, partyLeaver); + if (map.hashCode() == mapObj.hashCode()) { + partyItems = partyMapItems; + } } } + if (partyItems != null && exPartyMembers == null) { + map.updatePartyItemDropsToNewcomer(this, partyItems); + } + updatePartyTownDoors(party, this, partyLeaver, partyMembers); } diff --git a/src/server/life/MapleMonster.java b/src/server/life/MapleMonster.java index 8a7e1bcd07..9c95f6f224 100644 --- a/src/server/life/MapleMonster.java +++ b/src/server/life/MapleMonster.java @@ -1407,13 +1407,11 @@ public class MapleMonster extends AbstractLoadedMapleLife { monsterLock.lock(); try { - /* - for (Pair skill : usedSkills) { + for (Pair skill : usedSkills) { // thanks OishiiKawaiiDesu for noticing an issue with mobskill cooldown if (skill.getLeft() == useSkillid && skill.getRight() == toUse.getSkillLevel()) { return false; } } - */ int mpCon = toUse.getMpCon(); if (mp < mpCon) { diff --git a/src/server/maps/MapleMap.java b/src/server/maps/MapleMap.java index 6e5ded039f..1d9e2ce001 100644 --- a/src/server/maps/MapleMap.java +++ b/src/server/maps/MapleMap.java @@ -1018,13 +1018,15 @@ public class MapleMap { unregisterItemDrop(mdrop); } - public void updatePlayerItemDrops(int partyid, int charid, List partyMembers, MapleCharacter partyLeaver) { - for(MapleMapItem mdrop : getDroppedItems()) { - if(mdrop.getOwnerId() == charid) { + public List updatePlayerItemDropsToParty(int partyid, int charid, List partyMembers, MapleCharacter partyLeaver) { + List partyDrops = new LinkedList<>(); + + for (MapleMapItem mdrop : getDroppedItems()) { + if (mdrop.getOwnerId() == charid) { mdrop.lockItem(); try { if (mdrop.isPickedUp()) { - return; + continue; } mdrop.setPartyOwnerId(partyid); @@ -1032,21 +1034,21 @@ public class MapleMap { byte[] removePacket = MaplePacketCreator.silentRemoveItemFromMap(mdrop.getObjectId()); byte[] updatePacket = MaplePacketCreator.updateMapItemObject(mdrop, partyLeaver == null); - for(MapleCharacter mc : partyMembers) { - if(this.equals(mc.getMap())) { + for (MapleCharacter mc : partyMembers) { + if (this.equals(mc.getMap())) { mc.announce(removePacket); - if(mc.needQuestItem(mdrop.getQuest(), mdrop.getItemId())) { + if (mc.needQuestItem(mdrop.getQuest(), mdrop.getItemId())) { mc.announce(updatePacket); } } } - if(partyLeaver != null) { - if(this.equals(partyLeaver.getMap())) { + if (partyLeaver != null) { + if (this.equals(partyLeaver.getMap())) { partyLeaver.announce(removePacket); - if(partyLeaver.needQuestItem(mdrop.getQuest(), mdrop.getItemId())) { + if (partyLeaver.needQuestItem(mdrop.getQuest(), mdrop.getItemId())) { partyLeaver.announce(MaplePacketCreator.updateMapItemObject(mdrop, true)); } } @@ -1054,6 +1056,36 @@ public class MapleMap { } finally { mdrop.unlockItem(); } + } else if (partyid != -1 && mdrop.getPartyOwnerId() == partyid) { + partyDrops.add(mdrop); + } + } + + return partyDrops; + } + + public void updatePartyItemDropsToNewcomer(MapleCharacter newcomer, List partyItems) { + for (MapleMapItem mdrop : partyItems) { + mdrop.lockItem(); + try { + if (mdrop.isPickedUp()) { + continue; + } + + byte[] removePacket = MaplePacketCreator.silentRemoveItemFromMap(mdrop.getObjectId()); + byte[] updatePacket = MaplePacketCreator.updateMapItemObject(mdrop, true); + + if (newcomer != null) { + if (this.equals(newcomer.getMap())) { + newcomer.announce(removePacket); + + if (newcomer.needQuestItem(mdrop.getQuest(), mdrop.getItemId())) { + newcomer.announce(updatePacket); + } + } + } + } finally { + mdrop.unlockItem(); } } } diff --git a/src/server/maps/MapleMapItem.java b/src/server/maps/MapleMapItem.java index 163845b012..529cef07d9 100644 --- a/src/server/maps/MapleMapItem.java +++ b/src/server/maps/MapleMapItem.java @@ -23,7 +23,6 @@ package server.maps; import client.MapleCharacter; import client.MapleClient; import client.inventory.Item; -import constants.ServerConstants; import java.awt.Point; import java.util.concurrent.locks.Lock; import tools.MaplePacketCreator; @@ -109,20 +108,18 @@ public class MapleMapItem extends AbstractMapleMapObject { party_ownerid = partyid; } - public final int getClientsideOwnerId(MapleCharacter player) { + public final int getClientsideOwnerId() { // thanks nozphex (RedHat) for noting an issue with collecting party items if (this.party_ownerid == -1) { return this.character_ownerid; } else { - if (!partyDrop && player.getId() == this.character_ownerid) { - return player.getId(); - } else if (player.getPartyId() == this.party_ownerid) { - return player.getId(); - } else { - return this.party_ownerid; - } + return this.party_ownerid; } } + public final boolean hasClientsideOwnership(MapleCharacter player) { + return this.character_ownerid == player.getId() || this.party_ownerid == player.getPartyId() || hasExpiredOwnershipTime(); + } + public final boolean isFFADrop() { return type == 2 || type == 3 || hasExpiredOwnershipTime(); } diff --git a/src/tools/MaplePacketCreator.java b/src/tools/MaplePacketCreator.java index e231aafdd6..5f84838ecd 100644 --- a/src/tools/MaplePacketCreator.java +++ b/src/tools/MaplePacketCreator.java @@ -1795,7 +1795,7 @@ public class MaplePacketCreator { mplew.writeBool(drop.getMeso() > 0); mplew.writeInt(drop.getItemId()); mplew.writeInt(giveOwnership ? 0 : -1); - mplew.write(drop.getDropType()); + mplew.write(drop.hasExpiredOwnershipTime() ? 2 : drop.getDropType()); mplew.writePos(drop.getPosition()); mplew.writeInt(giveOwnership ? 0 : -1); @@ -1813,8 +1813,8 @@ public class MaplePacketCreator { mplew.writeInt(drop.getObjectId()); mplew.writeBool(drop.getMeso() > 0); // 1 mesos, 0 item, 2 and above all item meso bag, mplew.writeInt(drop.getItemId()); // drop object ID - mplew.writeInt(drop.getClientsideOwnerId(player)); // owner charid/partyid :) - mplew.write(!drop.hasExpiredOwnershipTime() ? drop.getDropType() : 2); // 0 = timeout for non-owner, 1 = timeout for non-owner's party, 2 = FFA, 3 = explosive/FFA + mplew.writeInt(drop.getClientsideOwnerId()); // owner charid/partyid :) + mplew.write(drop.hasClientsideOwnership(player) ? 2 : drop.getDropType()); // 0 = timeout for non-owner, 1 = timeout for non-owner's party, 2 = FFA, 3 = explosive/FFA mplew.writePos(dropto); mplew.writeInt(drop.getDropper().getObjectId()); // dropper oid, found thanks to Li Jixue