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:
@@ -1790,3 +1790,8 @@ 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.
|
||||
|
||||
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.
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user