Party loot & Mob Skill cooldown patch

Fixed an issue with party loot that started from recent updates.
Implemented party loot permission update for players ingressing a party.
Fixed mob skills not using cooldown time.
This commit is contained in:
ronancpl
2019-04-06 23:57:27 -03:00
parent ee23a9405a
commit 0b80389971
6 changed files with 70 additions and 28 deletions
+12 -2
View File
@@ -1480,15 +1480,25 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
partyLeaver = this;
}
int partyId = exPartyMembers != null ? 0 : this.getPartyId();
MapleMap map = this.getMap();
List<MapleMapItem> partyItems = null;
int partyId = exPartyMembers != null ? -1 : this.getPartyId();
for(WeakReference<MapleMap> mapRef : mapids) {
MapleMap mapObj = mapRef.get();
if(mapObj != null) {
mapObj.updatePlayerItemDrops(partyId, id, partyMembers, partyLeaver);
List<MapleMapItem> 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);
}
+1 -3
View File
@@ -1407,13 +1407,11 @@ public class MapleMonster extends AbstractLoadedMapleLife {
monsterLock.lock();
try {
/*
for (Pair<Integer, Integer> skill : usedSkills) {
for (Pair<Integer, Integer> 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) {
+42 -10
View File
@@ -1018,13 +1018,15 @@ public class MapleMap {
unregisterItemDrop(mdrop);
}
public void updatePlayerItemDrops(int partyid, int charid, List<MapleCharacter> partyMembers, MapleCharacter partyLeaver) {
for(MapleMapItem mdrop : getDroppedItems()) {
if(mdrop.getOwnerId() == charid) {
public List<MapleMapItem> updatePlayerItemDropsToParty(int partyid, int charid, List<MapleCharacter> partyMembers, MapleCharacter partyLeaver) {
List<MapleMapItem> 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<MapleMapItem> 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();
}
}
}
+6 -9
View File
@@ -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();
}
+3 -3
View File
@@ -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