"Exp-party" Pi + Event script disabled on dispose + Personal loot fix

Refactored event scripts, no longer triggering after the event is deemed disposed.
Added MCPQ access in Dimensional Doors.
Revised Crusader/Dawn Warrior's Combo Attack, no longer resetting orbs after recasting during active time.
Added 4th job advancement handing out Maple Warrior skill book.
Fixed several issues with not being able to collect drops within owned exclusivity time when back-and-forth changing maps.
Revised visual EXP gain. Players that participated most in the defeat of the mob has the gain displayed in white, else yellow, somewhat similar to GMS.
Fixed client not disconnecting properly after closing the game inside MTS/Cash Shop, leading to no update on account's login state.
Fixed wrongly inputted PIC in anti-multiclient system blocking accounts to login under the same IP.
Fixed parameterless command inputs counting as "one empty command".
This commit is contained in:
ronancpl
2019-04-04 14:02:15 -03:00
parent 0b6951527d
commit a15713dfa2
42 changed files with 344 additions and 198 deletions
+2 -2
View File
@@ -557,7 +557,7 @@ public class CashShop {
return null;
}
public synchronized Item openCashShopSurprise() {
public synchronized Pair<Item, Item> openCashShopSurprise() {
Item css = getCashShopItemByItemid(5222000);
if(css != null) {
@@ -577,7 +577,7 @@ public class CashShop {
Item item = cItem.toItem();
addToInventory(item);
return item;
return new Pair<>(item, css);
} else {
return null;
}
+7 -2
View File
@@ -1107,7 +1107,7 @@ public class MapleStatEffect {
}
private void applyBuffEffect(MapleCharacter applyfrom, MapleCharacter applyto, boolean primary) {
if (!isMonsterRiding() && !isCouponBuff() && !isMysticDoor() && !isHyperBody()) { // last mystic door already dispelled if it has been used before.
if (!isMonsterRiding() && !isCouponBuff() && !isMysticDoor() && !isHyperBody() && !isCombo()) { // last mystic door already dispelled if it has been used before.
applyto.cancelEffect(this, true, -1);
}
@@ -1190,7 +1190,12 @@ public class MapleStatEffect {
List<Pair<MapleBuffStat, Integer>> dsstat = Collections.singletonList(new Pair<>(MapleBuffStat.WIND_WALK, 0));
mbuff = MaplePacketCreator.giveForeignBuff(applyto.getId(), dsstat);
} else if (isCombo()) {
mbuff = MaplePacketCreator.giveForeignBuff(applyto.getId(), statups);
Integer comboCount = applyto.getBuffedValue(MapleBuffStat.COMBO);
if (comboCount == null) comboCount = 0;
List<Pair<MapleBuffStat, Integer>> cbstat = Collections.singletonList(new Pair<>(MapleBuffStat.COMBO, comboCount));
buff = MaplePacketCreator.giveBuff((skill ? sourceid : -sourceid), localDuration, cbstat);
mbuff = MaplePacketCreator.giveForeignBuff(applyto.getId(), cbstat);
} else if (isMonsterRiding()) {
if (sourceid == Corsair.BATTLE_SHIP) {//hp
if (applyto.getBattleshipHp() <= 0) {
+24 -5
View File
@@ -535,15 +535,34 @@ public class MapleMonster extends AbstractLoadedMapleLife {
}
}
private void propagateExperienceGains(Map<MapleCharacter, Float> personalExpReward, Map<MapleCharacter, Float> partyExpReward) {
private static double calcExperienceStandDevThreshold(Map<MapleCharacter, Float> personalExpReward, float exp2) {
float avgExpReward = 0.0f;
for (Float exp : personalExpReward.values()) {
avgExpReward += exp;
}
avgExpReward -= exp2; // clear out the 20% raw exp from last hitting
avgExpReward /= personalExpReward.size();
float varExpReward = 0.0f;
for (Float exp : personalExpReward.values()) {
varExpReward += Math.pow(exp - avgExpReward, 2);
}
varExpReward /= personalExpReward.size();
return avgExpReward + Math.sqrt(varExpReward);
}
private void propagateExperienceGains(Map<MapleCharacter, Float> personalExpReward, Map<MapleCharacter, Float> partyExpReward, float exp2) {
Set<MapleCharacter> expRewardPlayers = new HashSet<>(personalExpReward.keySet());
expRewardPlayers.addAll(partyExpReward.keySet());
double sdevExp = calcExperienceStandDevThreshold(personalExpReward, exp2);
for (MapleCharacter chr : expRewardPlayers) {
Float personalExp = personalExpReward.get(chr);
Float partyExp = partyExpReward.get(chr);
this.giveExpToCharacter(chr, personalExp, partyExp);
this.giveExpToCharacter(chr, personalExp, partyExp, personalExp != null && personalExp >= sdevExp);
}
}
@@ -628,7 +647,7 @@ public class MapleMonster extends AbstractLoadedMapleLife {
mc.showUnderleveledInfo(this);
}
propagateExperienceGains(personalExpReward, partyExpReward);
propagateExperienceGains(personalExpReward, partyExpReward, killerLevel != Integer.MAX_VALUE ? exp2 : 0.0f);
}
private float getStatusExpMultiplier(MapleCharacter attacker) {
@@ -663,7 +682,7 @@ public class MapleMonster extends AbstractLoadedMapleLife {
return (int) exp;
}
private void giveExpToCharacter(MapleCharacter attacker, Float personalExp, Float partyExp) {
private void giveExpToCharacter(MapleCharacter attacker, Float personalExp, Float partyExp, boolean white) {
if (attacker.isAlive()) {
if (personalExp != null) {
personalExp *= getStatusExpMultiplier(attacker);
@@ -689,7 +708,7 @@ public class MapleMonster extends AbstractLoadedMapleLife {
int _partyExp = expValueToInteger(partyExp);
attacker.gainExp(_personalExp, _partyExp, true, false, false);
attacker.gainExp(_personalExp, _partyExp, true, false, white);
attacker.increaseEquipExp(_personalExp);
attacker.updateQuestMobCount(getId());
}
+4 -4
View File
@@ -1069,7 +1069,7 @@ public class MapleMap {
if (chr.needQuestItem(questid, idrop.getItemId())) {
mdrop.lockItem();
try {
c.announce(MaplePacketCreator.dropItemFromMapObject(chr.getParty() != null, mdrop, dropper.getPosition(), dropPos, (byte) 1));
c.announce(MaplePacketCreator.dropItemFromMapObject(chr, mdrop, dropper.getPosition(), dropPos, (byte) 1));
} finally {
mdrop.unlockItem();
}
@@ -1091,7 +1091,7 @@ public class MapleMap {
public void sendPackets(MapleClient c) {
mdrop.lockItem();
try {
c.announce(MaplePacketCreator.dropItemFromMapObject(c.getPlayer().getParty() != null, mdrop, dropper.getPosition(), droppos, (byte) 1));
c.announce(MaplePacketCreator.dropItemFromMapObject(c.getPlayer(), mdrop, dropper.getPosition(), droppos, (byte) 1));
} finally {
mdrop.unlockItem();
}
@@ -2179,7 +2179,7 @@ public class MapleMap {
public void sendPackets(MapleClient c) {
mdrop.lockItem();
try {
c.announce(MaplePacketCreator.dropItemFromMapObject(c.getPlayer().getParty() != null, mdrop, dropper.getPosition(), droppos, (byte) 1));
c.announce(MaplePacketCreator.dropItemFromMapObject(c.getPlayer(), mdrop, dropper.getPosition(), droppos, (byte) 1));
} finally {
mdrop.unlockItem();
}
@@ -2877,7 +2877,7 @@ public class MapleMap {
chrRLock.lock();
try {
for (MapleCharacter chr : characters) {
final byte[] packet = MaplePacketCreator.dropItemFromMapObject(chr.getParty() != null, mdrop, dropperPos, dropPos, mod);
final byte[] packet = MaplePacketCreator.dropItemFromMapObject(chr, mdrop, dropperPos, dropPos, mod);
if (rangeSq < Double.POSITIVE_INFINITY) {
if (rangedFrom.distanceSq(chr.getPosition()) <= rangeSq) {
+20 -2
View File
@@ -23,6 +23,7 @@ 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;
@@ -35,7 +36,7 @@ public class MapleMapItem extends AbstractMapleMapObject {
protected MapleMapObject dropper;
protected int character_ownerid, party_ownerid, meso, questid = -1;
protected byte type;
protected boolean pickedUp = false, playerDrop;
protected boolean pickedUp = false, playerDrop, partyDrop;
protected long dropTime;
private Lock itemLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.MAP_ITEM);
@@ -45,6 +46,7 @@ public class MapleMapItem extends AbstractMapleMapObject {
this.dropper = dropper;
this.character_ownerid = owner.getId();
this.party_ownerid = owner.getPartyId();
this.partyDrop = this.party_ownerid != -1;
this.ownerClient = owner.getClient();
this.meso = 0;
this.type = type;
@@ -57,6 +59,7 @@ public class MapleMapItem extends AbstractMapleMapObject {
this.dropper = dropper;
this.character_ownerid = owner.getId();
this.party_ownerid = owner.getPartyId();
this.partyDrop = this.party_ownerid != -1;
this.ownerClient = owner.getClient();
this.meso = 0;
this.type = type;
@@ -70,6 +73,7 @@ public class MapleMapItem extends AbstractMapleMapObject {
this.dropper = dropper;
this.character_ownerid = owner.getId();
this.party_ownerid = owner.getPartyId();
this.partyDrop = this.party_ownerid != -1;
this.ownerClient = owner.getClient();
this.meso = meso;
this.type = type;
@@ -105,6 +109,20 @@ public class MapleMapItem extends AbstractMapleMapObject {
party_ownerid = partyid;
}
public final int getClientsideOwnerId(MapleCharacter player) {
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;
}
}
}
public final boolean isFFADrop() {
return type == 2 || type == 3 || hasExpiredOwnershipTime();
}
@@ -187,7 +205,7 @@ public class MapleMapItem extends AbstractMapleMapObject {
if (chr.needQuestItem(questid, getItemId())) {
this.lockItem();
try {
client.announce(MaplePacketCreator.dropItemFromMapObject(chr.getParty() != null, this, null, getPosition(), (byte) 2));
client.announce(MaplePacketCreator.dropItemFromMapObject(chr, this, null, getPosition(), (byte) 2));
} finally {
this.unlockItem();
}