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