Reactor Loot + Obstacles damage mob + Static calls from scripts

Revised starting AP, now working out with flags. To supply the 9AP shortage of 4/4/4/4, two options: one giving out 9 AP from the start, other giving 4/5 AP when changing jobs (1st, 2nd). This change would also work with the autoassign for beginners flag.
Refactored several quest scripts, that would be glitching the player when doing quest start/complete and disposing under the same script status.
Cleared some cases with the quest reward system where it would call out a "full inventory" even though new inventory slots could get discovered when doing the quest loot transaction.
Fixed an issue with player stores being deployed overlapping in a few scenarios.
Fixed reduced EXP gain from kills when triggering skill Mortal Blow.
Added "open Duey" functionality when clicking "O" in the incoming package notification.
Fixed packages without messages (a quirk from quick delivery) not accounting visually as a "quick" one.
Fixed certain mounts (non-item skill mounts, such as Yeti or Spaceship) not showing up properly to other players when changing maps.
Added handler for mob damage by environment objects (OrbisPQ jail storage area).
Added a placeholder on mob's stolen items to prevent more steals to be placed as soon as the Steal mechanism is triggered.
Patched boss logs not removing recent entries from the DB tables (the reset method is actually supposed to clear every entry).
Revised a possible memory leak scenario happening due to an exception thrown midway monster kill method.
Improved reactor drops, now placing loots visible for the acting player centered (similar as to how mob loots work).
Refactored several issues in scripts, related to accessing static Java methods through an object, that would start appearing after transitioning to Java 8.
This commit is contained in:
ronancpl
2019-08-14 21:14:15 -03:00
parent 2c16a4d908
commit f958624f6a
233 changed files with 2368 additions and 888 deletions

View File

@@ -53,6 +53,7 @@ import server.partyquest.Pyramid;
import server.quest.MapleQuest;
import tools.MaplePacketCreator;
import client.MapleCharacter;
import client.MapleCharacter.DelayedQuestUpdate;
import client.MapleClient;
import client.MapleQuestStatus;
import client.SkillFactory;
@@ -468,12 +469,12 @@ public class AbstractPlayerInteraction {
public void resetAllQuestProgress(int qid) {
getPlayer().getQuest(MapleQuest.getInstance(qid)).resetAllProgress();
getClient().announce(MaplePacketCreator.updateQuest(getPlayer().getQuest(MapleQuest.getInstance(qid)), false));
getPlayer().announceUpdateQuest(DelayedQuestUpdate.UPDATE, getPlayer().getQuest(MapleQuest.getInstance(qid)), false);
}
public void resetQuestProgress(int qid, int pid) {
getPlayer().getQuest(MapleQuest.getInstance(qid)).resetProgress(pid);
getClient().announce(MaplePacketCreator.updateQuest(getPlayer().getQuest(MapleQuest.getInstance(qid)), false));
getPlayer().announceUpdateQuest(DelayedQuestUpdate.UPDATE, getPlayer().getQuest(MapleQuest.getInstance(qid)), false);
}
public boolean forceStartQuest(int id) {

View File

@@ -70,7 +70,7 @@ public abstract class AbstractScriptManager {
NashornScriptEngine engine = c.getScriptEngine(cachePath);
if (engine == null) {
engine = getScriptEngine(cachePath);
engine = getScriptEngine(path);
c.setScriptEngine(path, engine);
}

View File

@@ -347,6 +347,12 @@ public class EventManager {
private boolean startLobbyInstance(int lobbyId) {
lobbyLock.lock();
try {
if (lobbyId < 0) {
lobbyId = 0;
} else if (lobbyId >= maxLobbys) {
lobbyId = maxLobbys - 1;
}
if(!openedLobbys.get(lobbyId)) {
openedLobbys.set(lobbyId, true);
return true;

View File

@@ -21,6 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package scripting.map;
import client.MapleCharacter.DelayedQuestUpdate;
import client.MapleClient;
import client.MapleQuestStatus;
import scripting.AbstractPlayerInteraction;
@@ -99,7 +100,7 @@ public class MapScriptMethods extends AbstractPlayerInteraction {
}
String status = Integer.toString(q.getMedalProgress());
String infoex = quest.getInfoEx();
getPlayer().announce(MaplePacketCreator.updateQuest(q, true));
getPlayer().announceUpdateQuest(DelayedQuestUpdate.UPDATE, q, true);
StringBuilder smp = new StringBuilder();
StringBuilder etm = new StringBuilder();
if (status.equals(infoex)) {
@@ -127,7 +128,7 @@ public class MapScriptMethods extends AbstractPlayerInteraction {
return;
}
String status = Integer.toString(q.getMedalProgress());
getPlayer().announce(MaplePacketCreator.updateQuest(q, true));
getPlayer().announceUpdateQuest(DelayedQuestUpdate.UPDATE, q, true);
getPlayer().announce(MaplePacketCreator.earnTitleMessage(status + "/5 Completed"));
getPlayer().announce(MaplePacketCreator.earnTitleMessage("The One Who's Touched the Sky title in progress."));
if (Integer.toString(q.getMedalProgress()).equals(quest.getInfoEx())) {

View File

@@ -200,6 +200,8 @@ public class NPCScriptManager extends AbstractScriptManager {
} else {
resetContext(scriptFolder + "/" + cm.getNpc() + ".js", c);
}
c.getPlayer().flushDelayedUpdateQuests();
}
public void dispose(MapleClient c) {

View File

@@ -163,6 +163,7 @@ public class QuestScriptManager extends AbstractScriptManager {
scripts.remove(c);
c.getPlayer().setNpcCooldown(System.currentTimeMillis());
resetContext("quest/" + qm.getQuest() + ".js", c);
c.getPlayer().flushDelayedUpdateQuests();
}
public void dispose(MapleClient c) {

View File

@@ -30,6 +30,7 @@ import constants.ItemConstants;
import constants.ServerConstants;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ScheduledFuture;
import java.util.logging.Level;
@@ -57,24 +58,70 @@ import tools.MaplePacketCreator;
*/
public class ReactorActionManager extends AbstractPlayerInteraction {
private MapleReactor reactor;
private MapleClient client;
private Invocable iv;
private ScheduledFuture<?> sprayTask = null;
public ReactorActionManager(MapleClient c, MapleReactor reactor, Invocable iv) {
super(c);
this.reactor = reactor;
this.client = c;
this.iv = iv;
}
public void hitReactor() {
reactor.hitReactor(client);
reactor.hitReactor(c);
}
public void destroyNpc(int npcId) {
reactor.getMap().destroyNPC(npcId);
}
private static void sortDropEntries(List<ReactorDropEntry> from, List<ReactorDropEntry> item, List<ReactorDropEntry> visibleQuest, List<ReactorDropEntry> otherQuest, MapleCharacter chr) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
for(ReactorDropEntry mde : from) {
if(!ii.isQuestItem(mde.itemId)) {
item.add(mde);
} else {
if(chr.needQuestItem(mde.questid, mde.itemId)) {
visibleQuest.add(mde);
} else {
otherQuest.add(mde);
}
}
}
}
private static List<ReactorDropEntry> assembleReactorDropEntries(MapleCharacter chr, List<ReactorDropEntry> items) {
final List<ReactorDropEntry> dropEntry = new ArrayList<>();
final List<ReactorDropEntry> visibleQuestEntry = new ArrayList<>();
final List<ReactorDropEntry> otherQuestEntry = new ArrayList<>();
sortDropEntries(items, dropEntry, visibleQuestEntry, otherQuestEntry, chr);
Collections.shuffle(dropEntry);
Collections.shuffle(visibleQuestEntry);
Collections.shuffle(otherQuestEntry);
items.clear();
items.addAll(dropEntry);
items.addAll(visibleQuestEntry);
items.addAll(otherQuestEntry);
List<ReactorDropEntry> items1 = new ArrayList<>(items.size());
List<ReactorDropEntry> items2 = new ArrayList<>(items.size() / 2);
for (int i = 0; i < items.size(); i++) {
if (i % 2 == 0) {
items1.add(items.get(i));
} else {
items2.add(items.get(i));
}
}
Collections.reverse(items1);
items1.addAll(items2);
return items1;
}
public void sprayItems() {
sprayItems(false, 0, 0, 0, 0);
@@ -109,10 +156,10 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
}
public void dropItems(boolean delayed, int posX, int posY, boolean meso, int mesoChance, final int minMeso, final int maxMeso, int minItems) {
if(c.getPlayer() == null) return;
List<ReactorDropEntry> items = generateDropList(getDropChances(), c.getPlayer().getDropRate(), meso, mesoChance, minItems);
MapleCharacter chr = c.getPlayer();
if(chr == null) return;
List<ReactorDropEntry> items = assembleReactorDropEntries(chr, generateDropList(getDropChances(), chr.getDropRate(), meso, mesoChance, minItems));
if(items.size() % 2 == 0) posX -= 12;
final Point dropPos = new Point(posX, posY);
@@ -127,8 +174,8 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
if (d.itemId == 0) {
int range = maxMeso - minMeso;
int displayDrop = (int) (Math.random() * range) + minMeso;
int mesoDrop = (displayDrop * client.getWorldServer().getMesoRate());
reactor.getMap().spawnMesoDrop(mesoDrop, reactor.getMap().calcDropPos(dropPos, reactor.getPosition()), reactor, client.getPlayer(), false, (byte) 2);
int mesoDrop = (displayDrop * c.getWorldServer().getMesoRate());
reactor.getMap().spawnMesoDrop(mesoDrop, reactor.getMap().calcDropPos(dropPos, reactor.getPosition()), reactor, c.getPlayer(), false, (byte) 2);
} else {
Item drop;
@@ -142,10 +189,9 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
}
}
} else {
final MapleCharacter chr = client.getPlayer();
final MapleReactor r = reactor;
final List<ReactorDropEntry> dropItems = items;
final int worldMesoRate = client.getWorldServer().getMesoRate();
final int worldMesoRate = c.getWorldServer().getMesoRate();
dropPos.x -= (12 * items.size());
@@ -178,7 +224,7 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
dropPos.x += 25;
}
}, 100);
}, 200);
}
}
@@ -187,37 +233,21 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
}
private List<ReactorDropEntry> generateDropList(List<ReactorDropEntry> drops, int dropRate, boolean meso, int mesoChance, int minItems) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
List<ReactorDropEntry> items = new ArrayList<>();
List<ReactorDropEntry> questItems = new ArrayList<>();
int numItems = 0;
if (meso && Math.random() < (1 / (double) mesoChance)) {
items.add(new ReactorDropEntry(0, mesoChance, -1));
}
for(ReactorDropEntry mde : drops) {
if (Math.random() < (dropRate / (double) mde.chance)) {
if(!ii.isQuestItem(mde.itemId)) {
items.add(mde);
} else {
questItems.add(mde);
}
numItems++;
items.add(mde);
}
}
while (numItems < minItems) {
while (items.size() < minItems) {
items.add(new ReactorDropEntry(0, mesoChance, -1));
numItems++;
}
java.util.Collections.shuffle(items);
java.util.Collections.shuffle(questItems);
items.addAll(questItems);
return items;
}
@@ -226,7 +256,7 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
}
public void createMapMonitor(int mapId, String portal) {
new MapMonitor(client.getChannelServer().getMapFactory().getMap(mapId), portal);
new MapMonitor(c.getChannelServer().getMapFactory().getMap(mapId), portal);
}
public void spawnMonster(int id, int qty) {