Reactor drops & Looting & Mob HP overhaul + TreasurePQ

Modified coupon rates buff icon to not show up as expirable.
Reactor drops now also drops quest items at the border of the dropped items.
Added themed drop data for the Cake boss.
Reworked the Balrog expedition.
Added quest script for the Assassinate skill.
Fixed looting system blocking the killer's party from retrieving a loot until the FFA timeout.
Fixed a deadlock with the MapleMap class.
Refactored damage/heal contabilization on mobs.
Fixed issues with HT and status-based damage, providing weird issues with mob HP.
New PQ: TreasurePQ, for level 140+.
This commit is contained in:
ronancpl
2018-03-05 21:23:50 -03:00
parent f40a7fa2f8
commit bbd2debc08
78 changed files with 24225 additions and 21968 deletions

View File

@@ -254,6 +254,7 @@ public class MapleMap {
}
public void setReactorState() {
chrRLock.lock();
objectRLock.lock();
try {
for (MapleMapObject o : mapobjects.values()) {
@@ -272,6 +273,7 @@ public class MapleMap {
}
} finally {
objectRLock.unlock();
chrRLock.unlock();
}
}
@@ -564,7 +566,7 @@ public class MapleMap {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
for(MonsterDropEntry mde : from) {
if(mde.itemId == 0 || !ii.isQuestItem(mde.itemId)) {
if(!ii.isQuestItem(mde.itemId)) {
item.add(mde);
} else {
quest.add(mde);
@@ -585,9 +587,9 @@ public class MapleMap {
for (final MonsterDropEntry de : dropEntry) {
if (Randomizer.nextInt(999999) < (long) de.chance * chRate) {
if (droptype == 3) {
pos.x = (int) (mobpos + (d % 2 == 0 ? (40 * (d + 1) / 2) : -(40 * (d / 2))));
pos.x = (int) (mobpos + ((d % 2 == 0) ? (40 * ((d + 1) / 2)) : -(40 * (d / 2))));
} else {
pos.x = (int) (mobpos + ((d % 2 == 0) ? (25 * (d + 1) / 2) : -(25 * (d / 2))));
pos.x = (int) (mobpos + ((d % 2 == 0) ? (25 * ((d + 1) / 2)) : -(25 * (d / 2))));
}
if (de.itemId == 0) { // meso
int mesos = Randomizer.nextInt(de.Maximum - de.Minimum) + de.Minimum;
@@ -1014,21 +1016,10 @@ public class MapleMap {
*/
if (damage > 0) {
monster.damage(chr, damage);
monster.damage(chr, damage, false);
if (!monster.isAlive()) { // monster just died
killed = true;
}
} else if (monster.getId() >= 8810002 && monster.getId() <= 8810009) {
for (MapleMapObject object : chr.getMap().getMapObjects()) {
MapleMonster mons = chr.getMap().getMonsterByOid(object.getObjectId());
if (mons != null) {
if (monster.isAlive() && (monster.getId() >= 8810010 && monster.getId() <= 8810017)) {
if (mons.getId() == 8810018) {
killMonster(mons, chr, true);
}
}
}
}
}
} finally {
monster.unlockMonster();
@@ -1055,6 +1046,14 @@ public class MapleMap {
return mobs;
}
public void broadcastBalrogVictory(String leaderName) {
for (Channel cserv : Server.getInstance().getWorld(world).getChannels()) {
for (MapleCharacter player : cserv.getPlayerStorage().getAllCharacters()) {
player.dropMessage(6, "[VICTORY] " + leaderName + "'s party has successfully defeated the Balrog! Praise to them, they finished with " + countAlivePlayers() + " players alive.");
}
}
}
public void broadcastHorntailVictory() {
for (Channel cserv : Server.getInstance().getWorld(world).getChannels()) {
for (MapleCharacter player : cserv.getPlayerStorage().getAllCharacters()) {
@@ -1088,8 +1087,9 @@ public class MapleMap {
if (chr == null) {
spawnedMonstersOnMap.decrementAndGet();
monster.setHp(0);
monster.setHpZero();
removeMapObject(monster);
monster.dispatchMonsterKilled(false);
broadcastMessage(MaplePacketCreator.killMonster(monster.getObjectId(), animation), monster.getPosition());
return;
@@ -1118,10 +1118,9 @@ public class MapleMap {
}
spawnedMonstersOnMap.decrementAndGet();
monster.setHp(0);
//if (monster.getStats().selfDestruction() == null) {//FUU BOMBS D:
monster.setHpZero();
removeMapObject(monster);
//}
if (monster.getCP() > 0 && chr.getCarnival() != null) {
chr.getCarnivalParty().addCP(chr, monster.getCP());
chr.announce(MaplePacketCreator.updateCP(chr.getCP(), chr.getObtainedCP()));
@@ -1141,8 +1140,10 @@ public class MapleMap {
}
}
if (makeZakReal) {
MapleMap map = chr.getMap();
for (MapleMapObject object : objects) {
MapleMonster mons = chr.getMap().getMonsterByOid(object.getObjectId());
MapleMonster mons = map.getMonsterByOid(object.getObjectId());
if (mons != null) {
if (mons.getId() == 8800000) {
makeMonsterReal(mons);
@@ -1178,12 +1179,12 @@ public class MapleMap {
this.killMonster(mob, (MapleCharacter) getPlayers().get(0), false);
}
public void killMonster(int monsId) {
public void killMonster(int mobId) {
List<MapleMapObject> mmoL = new LinkedList(getMapObjects());
for (MapleMapObject mmo : mmoL) {
if (mmo instanceof MapleMonster) {
if (((MapleMonster) mmo).getId() == monsId) {
if (((MapleMonster) mmo).getId() == mobId) {
this.killMonster((MapleMonster) mmo, (MapleCharacter) getPlayers().get(0), false);
}
}
@@ -1205,9 +1206,12 @@ public class MapleMap {
if (monster.getStats().isFriendly()) {
continue;
}
spawnedMonstersOnMap.decrementAndGet();
monster.setHp(0);
monster.setHpZero();
removeMapObject(monster);
monster.dispatchMonsterKilled(false);
}
}
@@ -1415,10 +1419,10 @@ public class MapleMap {
}
}
public Collection<MapleMapObject> getMapObjects() {
public List<MapleMapObject> getMapObjects() {
objectRLock.lock();
try {
return Collections.unmodifiableCollection(mapobjects.values());
return new LinkedList(mapobjects.values());
}
finally {
objectRLock.unlock();
@@ -1446,7 +1450,8 @@ public class MapleMap {
public void destroyNPC(int npcid) {
List<MapleMapObject> npcs = getMapObjectsInRange(new Point(0, 0), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.NPC));
chrRLock.lock();
objectWLock.lock();
try {
for (MapleMapObject obj : npcs) {
@@ -1459,6 +1464,7 @@ public class MapleMap {
}
} finally {
objectWLock.unlock();
chrRLock.unlock();
}
}
@@ -1582,7 +1588,7 @@ public class MapleMap {
if (m.getId() == 9300061) {
MapleMap.this.riceCakes++;
MapleMap.this.broadcastMessage(MaplePacketCreator.serverNotice(6, "The Moon Bunny made rice cake number " + (MapleMap.this.riceCakes)));
MapleMap.this.broadcastMessage(MaplePacketCreator.serverNotice(6, "The Moon Bunny made rice cake number " + (MapleMap.this.riceCakes) + "."));
}
dropFromFriendlyMonster(chr, m);
@@ -3240,11 +3246,10 @@ public class MapleMap {
}
public void clearDrops(MapleCharacter player) {
List<MapleMapObject> items = player.getMap().getMapObjectsInRange(player.getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.ITEM));
for (MapleMapObject i : items) {
for (MapleMapObject i : getMapObjectsInRange(player.getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.ITEM))) {
droppedItemCount.decrementAndGet();
player.getMap().removeMapObject(i);
player.getMap().broadcastMessage(MaplePacketCreator.removeItemFromMap(i.getObjectId(), 0, player.getId()));
removeMapObject(i);
this.broadcastMessage(MaplePacketCreator.removeItemFromMap(i.getObjectId(), 0, player.getId()));
}
}
@@ -3436,6 +3441,7 @@ public class MapleMap {
}
public void toggleHiddenNPC(int id) {
chrRLock.lock();
objectRLock.lock();
try {
for (MapleMapObject obj : mapobjects.values()) {
@@ -3452,6 +3458,7 @@ public class MapleMap {
}
} finally {
objectRLock.unlock();
chrRLock.unlock();
}
}
@@ -3531,23 +3538,43 @@ public class MapleMap {
TimerManager.getInstance().schedule(new Runnable() {
@Override
public void run() {
for (int x = 8810002; x <= 8810009; x++) {
spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(x), targetPoint);
}
final MapleMonster ht = MapleLifeFactory.getMonster(8810018);
ht.addListener(new MonsterListener() {
@Override
public void monsterKilled(int aniTime) {}
spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8810018), targetPoint);
@Override
public void monsterDamaged(MapleCharacter from, int trueDmg) {
ht.addHp(trueDmg);
}
@Override
public void monsterHealed(int trueHeal) {
ht.addHp(-trueHeal);
}
});
spawnMonsterOnGroundBelow(ht, targetPoint);
final MapleMonster ht = getMonsterById(8810018);
for(int mobId = 8810002; mobId <= 8810009; mobId++) {
getMonsterById(mobId).addListener(new MonsterListener() {
for (int x = 8810002; x <= 8810009; x++) {
MapleMonster m = MapleLifeFactory.getMonster(x);
m.addListener(new MonsterListener() {
@Override
public void monsterKilled(int aniTime) {}
@Override
public void monsterDamaged(MapleCharacter from, int trueDmg) {
ht.damage(from, trueDmg);
ht.applyAndGetHpDamage(trueDmg, true);
ht.broadcastMobHpBar(from);
}
@Override
public void monsterHealed(int trueHeal) {
ht.addHp(trueHeal);
}
});
spawnMonsterOnGroundBelow(m, targetPoint);
}
}