Experimental AutoJCE & Reactor's incorrect parameter

[EXPERIMENTAL] Added the AutoJCE feature to the server source. This is expected to solve the encryption size issue without resorting to overwrite the JCE files on the system.
LMPQ now sends players to random starting rooms, GMS-like.
Added a server flag for the free market item sold announcement.
Tweaked the reactor-hitting system, expecting to solve the incorrect parameter issue on the "multiple players hitting" scenario.
This commit is contained in:
ronancpl
2018-04-19 22:03:12 -03:00
parent 134c34fa58
commit a1fcf21ac9
19 changed files with 241 additions and 72 deletions
+2 -1
View File
@@ -29,6 +29,7 @@ import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType;
import com.mysql.jdbc.Statement;
import constants.ItemConstants;
import constants.ServerConstants;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@@ -192,7 +193,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
if (c.getPlayer().getMeso() >= price) {
if (canBuy(c, newItem)) {
c.getPlayer().gainMeso(-price, false);
announceItemSold(newItem, price); // idea thanks to vcoc
if(ServerConstants.USE_ANNOUNCE_SHOPITEMSOLD) announceItemSold(newItem, price); // idea thanks to vcoc
synchronized (sold) {
sold.add(new SoldItem(c.getPlayer().getName(), pItem.getItem().getItemId(), quantity, price));
+2 -2
View File
@@ -25,6 +25,7 @@ import client.MapleCharacter;
import client.MapleClient;
import client.inventory.Item;
import client.inventory.MapleInventoryType;
import constants.ServerConstants;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
@@ -35,7 +36,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import tools.locks.MonitoredReentrantLock;
import net.SendOpcode;
import net.server.Server;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import tools.MaplePacketCreator;
@@ -216,7 +216,7 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
if (canBuy(c, newItem)) {
c.getPlayer().gainMeso(-price, false);
announceItemSold(newItem, price); // idea thanks to vcoc
if(ServerConstants.USE_ANNOUNCE_SHOPITEMSOLD) announceItemSold(newItem, price); // idea thanks to vcoc
owner.gainMeso(price, true);
pItem.setBundles((short) (pItem.getBundles() - quantity));
+56 -47
View File
@@ -55,6 +55,7 @@ public class MapleReactor extends AbstractMapleMapObject {
private boolean attackHit;
private ScheduledFuture<?> timeoutTask = null;
private Lock reactorLock = new MonitoredReentrantLock(MonitoredLockType.REACTOR, true);
private Lock hitLock = new MonitoredReentrantLock(MonitoredLockType.REACTOR, true);
public MapleReactor(MapleReactorStats stats, int rid) {
this.evstate = (byte)0;
@@ -139,6 +140,10 @@ public class MapleReactor extends AbstractMapleMapObject {
public boolean isAlive() {
return alive;
}
public boolean isActive() {
return alive && stats.getType(state) != -1;
}
public void setAlive(boolean alive) {
this.alive = alive;
@@ -227,69 +232,73 @@ public class MapleReactor extends AbstractMapleMapObject {
hitReactor(false, 0, (short) 0, 0, c);
}
public synchronized void hitReactor(boolean wHit, int charPos, short stance, int skillid, MapleClient c) {
public void hitReactor(boolean wHit, int charPos, short stance, int skillid, MapleClient c) {
try {
if(!this.isAlive()) {
if(!this.isActive()) {
return;
}
this.lockReactor();
try {
cancelReactorTimeout();
attackHit = wHit;
if(hitLock.tryLock()) {
this.lockReactor();
try {
cancelReactorTimeout();
attackHit = wHit;
if(ServerConstants.USE_DEBUG == true) c.getPlayer().dropMessage(5, "Hitted REACTOR " + this.getId() + " with POS " + charPos + " , STANCE " + stance + " , SkillID " + skillid + " , STATE " + stats.getType(state) + " STATESIZE " + stats.getStateSize(state));
ReactorScriptManager.getInstance().onHit(c, this);
if(ServerConstants.USE_DEBUG == true) c.getPlayer().dropMessage(5, "Hitted REACTOR " + this.getId() + " with POS " + charPos + " , STANCE " + stance + " , SkillID " + skillid + " , STATE " + stats.getType(state) + " STATESIZE " + stats.getStateSize(state));
ReactorScriptManager.getInstance().onHit(c, this);
int reactorType = stats.getType(state);
if (reactorType < 999 && reactorType != -1) {//type 2 = only hit from right (kerning swamp plants), 00 is air left 02 is ground left
if (!(reactorType == 2 && (stance == 0 || stance == 2))) { //get next state
for (byte b = 0; b < stats.getStateSize(state); b++) {//YAY?
List<Integer> activeSkills = stats.getActiveSkills(state, b);
if (activeSkills != null) {
if (!activeSkills.contains(skillid)) continue;
}
state = stats.getNextState(state, b);
if (stats.getNextState(state, b) == -1) {//end of reactor
if (reactorType < 100) {//reactor broken
if (delay > 0) {
map.destroyReactor(getObjectId());
} else {//trigger as normal
int reactorType = stats.getType(state);
if (reactorType < 999 && reactorType != -1) {//type 2 = only hit from right (kerning swamp plants), 00 is air left 02 is ground left
if (!(reactorType == 2 && (stance == 0 || stance == 2))) { //get next state
for (byte b = 0; b < stats.getStateSize(state); b++) {//YAY?
List<Integer> activeSkills = stats.getActiveSkills(state, b);
if (activeSkills != null) {
if (!activeSkills.contains(skillid)) continue;
}
state = stats.getNextState(state, b);
if (stats.getNextState(state, b) == -1) {//end of reactor
if (reactorType < 100) {//reactor broken
if (delay > 0) {
map.destroyReactor(getObjectId());
} else {//trigger as normal
map.broadcastMessage(MaplePacketCreator.triggerReactor(this, stance));
}
} else {//item-triggered on final step
map.broadcastMessage(MaplePacketCreator.triggerReactor(this, stance));
}
} else {//item-triggered on final step
map.broadcastMessage(MaplePacketCreator.triggerReactor(this, stance));
}
ReactorScriptManager.getInstance().act(c, this);
} else { //reactor not broken yet
map.broadcastMessage(MaplePacketCreator.triggerReactor(this, stance));
if (state == stats.getNextState(state, b)) {//current state = next state, looping reactor
ReactorScriptManager.getInstance().act(c, this);
}
} else { //reactor not broken yet
map.broadcastMessage(MaplePacketCreator.triggerReactor(this, stance));
if (state == stats.getNextState(state, b)) {//current state = next state, looping reactor
ReactorScriptManager.getInstance().act(c, this);
}
setShouldCollect(true); // refresh collectability on item drop-based reactors
refreshReactorTimeout();
if(stats.getType(state) == 100) {
map.searchItemReactors(this);
setShouldCollect(true); // refresh collectability on item drop-based reactors
refreshReactorTimeout();
if(stats.getType(state) == 100) {
map.searchItemReactors(this);
}
}
break;
}
break;
}
} else {
state++;
map.broadcastMessage(MaplePacketCreator.triggerReactor(this, stance));
ReactorScriptManager.getInstance().act(c, this);
setShouldCollect(true);
refreshReactorTimeout();
if(stats.getType(state) == 100) {
map.searchItemReactors(this);
}
}
} else {
state++;
map.broadcastMessage(MaplePacketCreator.triggerReactor(this, stance));
ReactorScriptManager.getInstance().act(c, this);
setShouldCollect(true);
refreshReactorTimeout();
if(stats.getType(state) == 100) {
map.searchItemReactors(this);
}
} finally {
this.unlockReactor();
}
} finally {
this.unlockReactor();
hitLock.unlock();
}
} catch(Exception e) {
e.printStackTrace();