HT spawn sequence + Banner length

Improved the Horntail spawn sequence to better fit the end of the animation with the HT parts assembly. Thanks to Arnah and Zenns.
Improved the usage of visual space by the "hint banners" throughout the source.
This commit is contained in:
ronancpl
2018-03-15 10:52:42 -03:00
parent 67ab83a09b
commit ae147a5a9f
8 changed files with 107 additions and 65 deletions

View File

@@ -825,4 +825,8 @@ Nova PQ: TreasurePQ, level 140+, acessível via portal em NLC.
08 Março 2018, 08 Março 2018,
Corrigido levelup contabilizando o stat INT nos ganhos de MP mesmo quando a flag USE_RANDOMIZE_HPMP_GAIN está desativada. Corrigido levelup contabilizando o stat INT nos ganhos de MP mesmo quando a flag USE_RANDOMIZE_HPMP_GAIN está desativada.
Aprimorado comando de item/drop agora permitindo gerar pets. Aprimorado comando de item/drop agora permitindo gerar pets.
14 Março 2018,
Modificado spawn do Horntail, utilizando efeitos de mob ao invés de schedules. Cortesia de Arnah e Zenns.
Modificado "hint" banners para usar menor espaço visual.

View File

@@ -1496,7 +1496,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
int nxGain = mapitem.getItemId() == 4031865 ? 100 : 250; int nxGain = mapitem.getItemId() == 4031865 ? 100 : 250;
this.getCashShop().gainCash(1, nxGain); this.getCashShop().gainCash(1, nxGain);
showHint("You have earned #e#b" + nxGain + " NX#k#n. (" + this.getCashShop().getCash(1) + " NX)"); showHint("You have earned #e#b" + nxGain + " NX#k#n. (" + this.getCashShop().getCash(1) + " NX)", 300);
this.getMap().pickItemDrop(pickupPacket, mapitem); this.getMap().pickItemDrop(pickupPacket, mapitem);
} else if (MapleInventoryManipulator.addFromDrop(client, mapitem.getItem(), true)) { } else if (MapleInventoryManipulator.addFromDrop(client, mapitem.getItem(), true)) {
@@ -1573,7 +1573,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
int nxGain = mapitem.getItemId() == 4031865 ? 100 : 250; int nxGain = mapitem.getItemId() == 4031865 ? 100 : 250;
this.getCashShop().gainCash(1, nxGain); this.getCashShop().gainCash(1, nxGain);
showHint("You have earned #e#b" + nxGain + " NX#k#n. (" + this.getCashShop().getCash(1) + " NX)"); showHint("You have earned #e#b" + nxGain + " NX#k#n. (" + this.getCashShop().getCash(1) + " NX)", 300);
} else if (useItem(client, mapitem.getItem().getItemId())) { } else if (useItem(client, mapitem.getItem().getItemId())) {
if (mapitem.getItem().getItemId() / 10000 == 238) { if (mapitem.getItem().getItemId() / 10000 == 238) {
this.getMonsterBook().addCard(client, mapitem.getItem().getItemId()); this.getMonsterBook().addCard(client, mapitem.getItem().getItemId());
@@ -4939,7 +4939,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
if(this.isPartyLeader()) party.assignNewLeader(client); if(this.isPartyLeader()) party.assignNewLeader(client);
PartyOperationHandler.leaveParty(party, mpc, client); PartyOperationHandler.leaveParty(party, mpc, client);
client.announceHint("You have reached #blevel 10#k, therefore you must leave your #rstarter party#k."); showHint("You have reached #blevel 10#k, therefore you must leave your #rstarter party#k.");
} }
if (this.guildid > 0) { if (this.guildid > 0) {
@@ -7238,7 +7238,11 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
} }
public void showHint(String msg) { public void showHint(String msg) {
client.announceHint(msg); showHint(msg, 500);
}
public void showHint(String msg, int length) {
client.announceHint(msg, length);
} }
public void showNote() { public void showNote() {
@@ -7993,7 +7997,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
} }
if(!showMsg.isEmpty()) { if(!showMsg.isEmpty()) {
this.showHint("#ePLAYER EQUIPMENTS:#n\r\n\r\n" + showMsg); this.showHint("#ePLAYER EQUIPMENTS:#n\r\n\r\n" + showMsg, 400);
} }
} }

View File

@@ -1258,8 +1258,8 @@ public class MapleClient {
session.write(packet); session.write(packet);
} }
public void announceHint(String msg) { public void announceHint(String msg, int length) {
announce(MaplePacketCreator.sendHint(msg, 500, 10)); announce(MaplePacketCreator.sendHint(msg, length, 10));
announce(MaplePacketCreator.enableActions()); announce(MaplePacketCreator.enableActions());
} }

View File

@@ -355,9 +355,9 @@ public class Commands {
case "droplimit": case "droplimit":
int dropCount = c.getPlayer().getMap().getDroppedItemCount(); int dropCount = c.getPlayer().getMap().getDroppedItemCount();
if(((float) dropCount) / ServerConstants.ITEM_LIMIT_ON_MAP < 0.75f) { if(((float) dropCount) / ServerConstants.ITEM_LIMIT_ON_MAP < 0.75f) {
c.getPlayer().showHint("Current drop count: #b" + dropCount + "#k / #e" + ServerConstants.ITEM_LIMIT_ON_MAP + "#n"); c.getPlayer().showHint("Current drop count: #b" + dropCount + "#k / #e" + ServerConstants.ITEM_LIMIT_ON_MAP + "#n", 300);
} else { } else {
c.getPlayer().showHint("Current drop count: #r" + dropCount + "#k / #e" + ServerConstants.ITEM_LIMIT_ON_MAP + "#n"); c.getPlayer().showHint("Current drop count: #r" + dropCount + "#k / #e" + ServerConstants.ITEM_LIMIT_ON_MAP + "#n", 300);
} }
break; break;
@@ -523,7 +523,7 @@ public class Commands {
showMsg += "Server QUEST Rate: #e#b" + c.getWorldServer().getQuestRate() + "x#k#n" + "\r\n"; showMsg += "Server QUEST Rate: #e#b" + c.getWorldServer().getQuestRate() + "x#k#n" + "\r\n";
} }
player.showHint(showMsg); player.showHint(showMsg, 300);
break; break;
case "rates": case "rates":
@@ -533,7 +533,7 @@ public class Commands {
showMsg_ += "DROP Rate: #e#b" + player.getDropRate() + "x#k#n" + "\r\n"; showMsg_ += "DROP Rate: #e#b" + player.getDropRate() + "x#k#n" + "\r\n";
if(ServerConstants.USE_QUEST_RATE) showMsg_ += "QUEST Rate: #e#b" + c.getWorldServer().getQuestRate() + "x#k#n" + "\r\n"; if(ServerConstants.USE_QUEST_RATE) showMsg_ += "QUEST Rate: #e#b" + c.getWorldServer().getQuestRate() + "x#k#n" + "\r\n";
player.showHint(showMsg_); player.showHint(showMsg_, 300);
break; break;
case "online": case "online":
@@ -1970,8 +1970,9 @@ public class Commands {
player.dropMessage(6, s.substring(0, s.length() - 2)); player.dropMessage(6, s.substring(0, s.length() - 2));
} }
} }
player.dropMessage(6, "There are a total of " + total + " players online.");
player.showHint("Players online: #e#r" + total + "#k#n."); //player.dropMessage(6, "There are a total of " + total + " players online.");
player.showHint("Players online: #e#r" + total + "#k#n.", 300);
break; break;
case "warpsnowball": case "warpsnowball":

View File

@@ -553,7 +553,7 @@ public class Equip extends Item {
} }
public final void showLevelupMessage(String msg, MapleClient c) { public final void showLevelupMessage(String msg, MapleClient c) {
c.getPlayer().showHint(msg); c.getPlayer().showHint(msg, 300);
} }
public void setItemExp(int exp) { public void setItemExp(int exp) {

View File

@@ -84,6 +84,7 @@ public class MapleMonster extends AbstractLoadedMapleLife {
private Map<Pair<Integer, Integer>, Integer> skillsUsed = new HashMap<>(); private Map<Pair<Integer, Integer>, Integer> skillsUsed = new HashMap<>();
private List<Integer> stolenItems = new ArrayList<>(); private List<Integer> stolenItems = new ArrayList<>();
private int team; private int team;
private int parentMobOid = 0;
private final HashMap<Integer, AtomicInteger> takenDamage = new HashMap<>(); private final HashMap<Integer, AtomicInteger> takenDamage = new HashMap<>();
private Lock externalLock = new MonitoredReentrantLock(MonitoredLockType.MOB_EXT); private Lock externalLock = new MonitoredReentrantLock(MonitoredLockType.MOB_EXT);
@@ -128,6 +129,14 @@ public class MapleMonster extends AbstractLoadedMapleLife {
public void setMap(MapleMap map) { public void setMap(MapleMap map) {
this.map = map; this.map = map;
} }
public int getParentMobOid() {
return parentMobOid;
}
public void setParentMobOid(int parentMobId) {
this.parentMobOid = parentMobId;
}
public int getHp() { public int getHp() {
return hp.get(); return hp.get();
@@ -497,6 +506,9 @@ public class MapleMonster extends AbstractLoadedMapleLife {
for (Integer mid : toSpawn) { for (Integer mid : toSpawn) {
final MapleMonster mob = MapleLifeFactory.getMonster(mid); final MapleMonster mob = MapleLifeFactory.getMonster(mid);
mob.setPosition(getPosition()); mob.setPosition(getPosition());
mob.setFh(getFh());
mob.setParentMobOid(getObjectId());
if (dropsDisabled()) { if (dropsDisabled()) {
mob.disableDrops(); mob.disableDrops();
} }

View File

@@ -3534,50 +3534,48 @@ public class MapleMap {
} }
public void spawnHorntailOnGroundBelow(final Point targetPoint) { // ayy lmao public void spawnHorntailOnGroundBelow(final Point targetPoint) { // ayy lmao
spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8810026), targetPoint); MapleMonster htIntro = MapleLifeFactory.getMonster(8810026);
TimerManager.getInstance().schedule(new Runnable() { spawnMonsterOnGroundBelow(htIntro, targetPoint);
final MapleMonster ht = MapleLifeFactory.getMonster(8810018);
ht.setParentMobOid(htIntro.getObjectId());
ht.addListener(new MonsterListener() {
@Override @Override
public void run() { public void monsterKilled(int aniTime) {}
final MapleMonster ht = MapleLifeFactory.getMonster(8810018);
ht.addListener(new MonsterListener() {
@Override
public void monsterKilled(int aniTime) {}
@Override @Override
public void monsterDamaged(MapleCharacter from, int trueDmg) { public void monsterDamaged(MapleCharacter from, int trueDmg) {
ht.addHp(trueDmg); ht.addHp(trueDmg);
}
@Override
public void monsterHealed(int trueHeal) {
ht.addHp(-trueHeal);
}
});
spawnMonsterOnGroundBelow(ht, targetPoint);
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.applyAndGetHpDamage(trueDmg, true);
ht.broadcastMobHpBar(from);
}
@Override
public void monsterHealed(int trueHeal) {
ht.addHp(trueHeal);
}
});
spawnMonsterOnGroundBelow(m, targetPoint);
}
} }
}, 5 * 1000); @Override
public void monsterHealed(int trueHeal) {
ht.addHp(-trueHeal);
}
});
spawnMonsterOnGroundBelow(ht, targetPoint);
for (int x = 8810002; x <= 8810009; x++) {
MapleMonster m = MapleLifeFactory.getMonster(x);
m.setParentMobOid(htIntro.getObjectId());
m.addListener(new MonsterListener() {
@Override
public void monsterKilled(int aniTime) {}
@Override
public void monsterDamaged(MapleCharacter from, int trueDmg) {
ht.applyAndGetHpDamage(trueDmg, true);
ht.broadcastMobHpBar(from);
}
@Override
public void monsterHealed(int trueHeal) {
ht.addHp(trueHeal);
}
});
spawnMonsterOnGroundBelow(m, targetPoint);
}
} }
} }

View File

@@ -1428,18 +1428,41 @@ public class MaplePacketCreator {
mplew.write(life.getStance()); mplew.write(life.getStance());
mplew.writeShort(0); //Origin FH //life.getStartFh() mplew.writeShort(0); //Origin FH //life.getStartFh()
mplew.writeShort(life.getFh()); mplew.writeShort(life.getFh());
if (effect > 0) {
mplew.write(effect); /**
mplew.write(0); * -4: Fake
mplew.writeShort(0); * -3: Appear after linked mob is dead
if (effect == 15) { * -2: Fade in
mplew.write(0); * 1: Smoke
* 3: King Slime spawn
* 4: Summoning rock thing, used for 3rd job?
* 6: Magical shit
* 7: Smoke shit
* 8: 'The Boss'
* 9/10: Grim phantom shit?
* 11/12: Nothing?
* 13: Frankenstein
* 14: Angry ^
* 15: Orb animation thing, ??
* 16: ??
* 19: Mushroom kingdom boss thing
*/
if (life.getParentMobOid() != 0) {
MapleMonster parentMob = life.getMap().getMonsterByOid(life.getParentMobOid());
if(parentMob != null && parentMob.isAlive()) {
mplew.write(effect != 0 ? effect : -3);
mplew.writeInt(life.getParentMobOid());
} else {
mplew.write(newSpawn ? -2 : -1);
} }
} else {
mplew.write(newSpawn ? -2 : -1);
} }
mplew.write(newSpawn ? -2 : -1);
mplew.write(life.getTeam()); mplew.write(life.getTeam());
mplew.writeInt(0); mplew.writeInt(0); // getItemEffect
return mplew.getPacket(); return mplew.getPacket();
} }