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

View File

@@ -1789,4 +1789,9 @@ Corrigido inserção de PIC errado no sistema anti-multicliente impossibilitando
04 Abril 2019, 04 Abril 2019,
Corrigido comandos sem parâmetros contabilizando feed de "um parâmetro vazio". Corrigido comandos sem parâmetros contabilizando feed de "um parâmetro vazio".
Ajustado moderadamente drop rate de vários equipamentos na DB. 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.

View File

@@ -1480,15 +1480,25 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
partyLeaver = this; 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) { for(WeakReference<MapleMap> mapRef : mapids) {
MapleMap mapObj = mapRef.get(); MapleMap mapObj = mapRef.get();
if(mapObj != null) { 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); updatePartyTownDoors(party, this, partyLeaver, partyMembers);
} }

View File

@@ -1407,13 +1407,11 @@ public class MapleMonster extends AbstractLoadedMapleLife {
monsterLock.lock(); monsterLock.lock();
try { try {
/* for (Pair<Integer, Integer> skill : usedSkills) { // thanks OishiiKawaiiDesu for noticing an issue with mobskill cooldown
for (Pair<Integer, Integer> skill : usedSkills) {
if (skill.getLeft() == useSkillid && skill.getRight() == toUse.getSkillLevel()) { if (skill.getLeft() == useSkillid && skill.getRight() == toUse.getSkillLevel()) {
return false; return false;
} }
} }
*/
int mpCon = toUse.getMpCon(); int mpCon = toUse.getMpCon();
if (mp < mpCon) { if (mp < mpCon) {

View File

@@ -1018,13 +1018,15 @@ public class MapleMap {
unregisterItemDrop(mdrop); unregisterItemDrop(mdrop);
} }
public void updatePlayerItemDrops(int partyid, int charid, List<MapleCharacter> partyMembers, MapleCharacter partyLeaver) { public List<MapleMapItem> updatePlayerItemDropsToParty(int partyid, int charid, List<MapleCharacter> partyMembers, MapleCharacter partyLeaver) {
for(MapleMapItem mdrop : getDroppedItems()) { List<MapleMapItem> partyDrops = new LinkedList<>();
if(mdrop.getOwnerId() == charid) {
for (MapleMapItem mdrop : getDroppedItems()) {
if (mdrop.getOwnerId() == charid) {
mdrop.lockItem(); mdrop.lockItem();
try { try {
if (mdrop.isPickedUp()) { if (mdrop.isPickedUp()) {
return; continue;
} }
mdrop.setPartyOwnerId(partyid); mdrop.setPartyOwnerId(partyid);
@@ -1032,21 +1034,21 @@ public class MapleMap {
byte[] removePacket = MaplePacketCreator.silentRemoveItemFromMap(mdrop.getObjectId()); byte[] removePacket = MaplePacketCreator.silentRemoveItemFromMap(mdrop.getObjectId());
byte[] updatePacket = MaplePacketCreator.updateMapItemObject(mdrop, partyLeaver == null); byte[] updatePacket = MaplePacketCreator.updateMapItemObject(mdrop, partyLeaver == null);
for(MapleCharacter mc : partyMembers) { for (MapleCharacter mc : partyMembers) {
if(this.equals(mc.getMap())) { if (this.equals(mc.getMap())) {
mc.announce(removePacket); mc.announce(removePacket);
if(mc.needQuestItem(mdrop.getQuest(), mdrop.getItemId())) { if (mc.needQuestItem(mdrop.getQuest(), mdrop.getItemId())) {
mc.announce(updatePacket); mc.announce(updatePacket);
} }
} }
} }
if(partyLeaver != null) { if (partyLeaver != null) {
if(this.equals(partyLeaver.getMap())) { if (this.equals(partyLeaver.getMap())) {
partyLeaver.announce(removePacket); partyLeaver.announce(removePacket);
if(partyLeaver.needQuestItem(mdrop.getQuest(), mdrop.getItemId())) { if (partyLeaver.needQuestItem(mdrop.getQuest(), mdrop.getItemId())) {
partyLeaver.announce(MaplePacketCreator.updateMapItemObject(mdrop, true)); partyLeaver.announce(MaplePacketCreator.updateMapItemObject(mdrop, true));
} }
} }
@@ -1054,6 +1056,36 @@ public class MapleMap {
} finally { } finally {
mdrop.unlockItem(); 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();
} }
} }
} }

View File

@@ -23,7 +23,6 @@ package server.maps;
import client.MapleCharacter; import client.MapleCharacter;
import client.MapleClient; import client.MapleClient;
import client.inventory.Item; import client.inventory.Item;
import constants.ServerConstants;
import java.awt.Point; import java.awt.Point;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import tools.MaplePacketCreator; import tools.MaplePacketCreator;
@@ -109,20 +108,18 @@ public class MapleMapItem extends AbstractMapleMapObject {
party_ownerid = partyid; 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) { if (this.party_ownerid == -1) {
return this.character_ownerid; return this.character_ownerid;
} else { } else {
if (!partyDrop && player.getId() == this.character_ownerid) { return this.party_ownerid;
return player.getId();
} else if (player.getPartyId() == this.party_ownerid) {
return player.getId();
} else {
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() { public final boolean isFFADrop() {
return type == 2 || type == 3 || hasExpiredOwnershipTime(); return type == 2 || type == 3 || hasExpiredOwnershipTime();
} }

View File

@@ -1795,7 +1795,7 @@ public class MaplePacketCreator {
mplew.writeBool(drop.getMeso() > 0); mplew.writeBool(drop.getMeso() > 0);
mplew.writeInt(drop.getItemId()); mplew.writeInt(drop.getItemId());
mplew.writeInt(giveOwnership ? 0 : -1); mplew.writeInt(giveOwnership ? 0 : -1);
mplew.write(drop.getDropType()); mplew.write(drop.hasExpiredOwnershipTime() ? 2 : drop.getDropType());
mplew.writePos(drop.getPosition()); mplew.writePos(drop.getPosition());
mplew.writeInt(giveOwnership ? 0 : -1); mplew.writeInt(giveOwnership ? 0 : -1);
@@ -1813,8 +1813,8 @@ public class MaplePacketCreator {
mplew.writeInt(drop.getObjectId()); mplew.writeInt(drop.getObjectId());
mplew.writeBool(drop.getMeso() > 0); // 1 mesos, 0 item, 2 and above all item meso bag, 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.getItemId()); // drop object ID
mplew.writeInt(drop.getClientsideOwnerId(player)); // owner charid/partyid :) mplew.writeInt(drop.getClientsideOwnerId()); // 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.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.writePos(dropto);
mplew.writeInt(drop.getDropper().getObjectId()); // dropper oid, found thanks to Li Jixue mplew.writeInt(drop.getDropper().getObjectId()); // dropper oid, found thanks to Li Jixue