Heal GMS + Improved chnl workers & Pshop tooltip + Equips on party HP

Slightly improved channel and disease announce workers performance.
Completion of repeatable quests no longer generates fame to players.
Equipment drop rates of Leprechaun were slightly decreased.
Fixed Pet Item Ignore not checking certain exploit cases correctly.
Optimized Pet Item Ignore server handler performance.
Fixed some exploits and improved performance on PetLootHandler.
Improved concurrency protection on MapleInventoryManipulator.
Heal skill effect on players now works GMS-intended, as description says. Also removed the delayed Heal cast effect to others.
Fixed party player HPBar not accounting the player's HP stat gained on equips towards the effective MaxHP.
The duration of mists generated by mobs has been rescaled to 10x longer than what has been displayed until now (wz duration property is supposed to actually be in 100ms).
Optimized timer management for mob skill cooldown and elemental effectiveness.
Implemented an additional inventory check system, to be used in cases where it's expected to remove a set group for items (with quantity) to then add a new group of items.
Fixed Player Shop/Hired Merchant "vacancy" tooltip, now properly showing whether the store has a visitor room or is already full at that time.
Fixed Player Shops only using the standard stand type.
Fixed cash pet food ignoring certain pet itemids when reading data from WZ.
This commit is contained in:
ronancpl
2018-07-21 14:40:46 -03:00
parent 3752ebbae5
commit bee8b5259b
78 changed files with 1194 additions and 628 deletions
+2 -2
View File
@@ -27,8 +27,8 @@ import scripting.portal.PortalScriptManager;
import server.MaplePortal;
import tools.MaplePacketCreator;
import java.util.concurrent.locks.Lock;
import tools.locks.MonitoredLockType;
import tools.locks.MonitoredReentrantLock;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReentrantLock;
public class MapleGenericPortal implements MaplePortal {
+32 -10
View File
@@ -40,13 +40,13 @@ import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import tools.locks.MonitoredReentrantLock;
import net.server.audit.locks.MonitoredReentrantLock;
import net.server.Server;
import server.MapleItemInformationProvider;
import tools.DatabaseConnection;
import tools.MaplePacketCreator;
import tools.Pair;
import tools.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredLockType;
/**
*
@@ -67,7 +67,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
private MapleMap map;
private Lock visitorLock = new MonitoredReentrantLock(MonitoredLockType.VISITOR_MERCH, true);
public MapleHiredMerchant(final MapleCharacter owner, int itemId, String desc) {
public MapleHiredMerchant(final MapleCharacter owner, String desc, int itemId) {
this.setPosition(owner.getPosition());
this.start = System.currentTimeMillis();
this.ownerId = owner.getId();
@@ -96,6 +96,22 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
}
}
public byte[] getShopRoomInfo() {
visitorLock.lock();
try {
byte count = 0;
for (MapleCharacter visitor : visitors) {
if (visitor != null) {
count++;
}
}
return new byte[]{count, (byte) (visitors.length + 1)};
} finally {
visitorLock.unlock();
}
}
public boolean addVisitor(MapleCharacter visitor) {
visitorLock.lock();
try {
@@ -103,6 +119,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
if (i > -1) {
visitors[i] = visitor;
broadcastToVisitors(MaplePacketCreator.hiredMerchantVisitorAdd(visitor, i + 1));
this.getMap().broadcastMessage(MaplePacketCreator.updateHiredMerchantBox(this));
return true;
}
@@ -123,6 +140,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
if (visitors[slot] != null && visitors[slot].getId() == visitor.getId()) {
visitors[slot] = null;
broadcastToVisitors(MaplePacketCreator.hiredMerchantVisitorLeave(slot + 1));
this.getMap().broadcastMessage(MaplePacketCreator.updateHiredMerchantBox(this));
}
} finally {
visitorLock.unlock();
@@ -151,15 +169,19 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
visitorLock.lock();
try {
for (int i = 0; i < 3; i++) {
if (visitors[i] != null) {
visitors[i].setHiredMerchant(null);
MapleCharacter visitor = visitors[i];
if (visitor != null) {
visitor.setHiredMerchant(null);
visitors[i].getClient().announce(MaplePacketCreator.leaveHiredMerchant(i + 1, 0x11));
visitors[i].getClient().announce(MaplePacketCreator.hiredMerchantMaintenanceMessage());
visitor.getClient().announce(MaplePacketCreator.leaveHiredMerchant(i + 1, 0x11));
visitor.getClient().announce(MaplePacketCreator.hiredMerchantMaintenanceMessage());
visitors[i] = null;
}
}
this.getMap().broadcastMessage(MaplePacketCreator.updateHiredMerchantBox(this));
} finally {
visitorLock.unlock();
}
@@ -272,7 +294,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
public void forceClose() {
//Server.getInstance().getChannel(world, channel).removeHiredMerchant(ownerId);
map.broadcastMessage(MaplePacketCreator.destroyHiredMerchant(getOwnerId()));
map.broadcastMessage(MaplePacketCreator.removeHiredMerchantBox(getOwnerId()));
map.removeMapObject(this);
MapleCharacter owner = Server.getInstance().getWorld(world).getPlayerStorage().getCharacterById(ownerId);
@@ -331,7 +353,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
public void closeShop(MapleClient c, boolean timeout) {
map.removeMapObject(this);
map.broadcastMessage(MaplePacketCreator.destroyHiredMerchant(ownerId));
map.broadcastMessage(MaplePacketCreator.removeHiredMerchantBox(ownerId));
c.getChannelServer().removeHiredMerchant(ownerId);
try {
@@ -634,7 +656,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
@Override
public void sendSpawnData(MapleClient client) {
client.announce(MaplePacketCreator.spawnHiredMerchant(this));
client.announce(MaplePacketCreator.spawnHiredMerchantBox(this));
}
public class SoldItem {
+18 -17
View File
@@ -52,9 +52,10 @@ import java.util.Map.Entry;
import java.util.Random;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import tools.locks.MonitoredReentrantLock;
import tools.locks.MonitoredReentrantReadWriteLock;
import java.util.concurrent.locks.Lock;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReentrantLock;
import net.server.audit.locks.MonitoredReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
@@ -90,7 +91,6 @@ import tools.FilePrinter;
import tools.MaplePacketCreator;
import tools.Pair;
import tools.Randomizer;
import tools.locks.MonitoredLockType;
public class MapleMap {
private static final List<MapleMapObjectType> rangedMapobjectTypes = Arrays.asList(MapleMapObjectType.SHOP, MapleMapObjectType.ITEM, MapleMapObjectType.NPC, MapleMapObjectType.MONSTER, MapleMapObjectType.DOOR, MapleMapObjectType.SUMMON, MapleMapObjectType.REACTOR);
@@ -1512,8 +1512,10 @@ public class MapleMap {
chrRLock.lock();
try {
for (MapleCharacter chr : characters) {
if (!chr.isHidden() && (chr.getControlledMonsters().size() < mincontrolled || mincontrolled == -1)) {
mincontrolled = chr.getControlledMonsters().size();
int ctrlMonsSize = chr.getControlledMonsters().size();
if (!chr.isHidden() && (ctrlMonsSize < mincontrolled || mincontrolled == -1)) {
mincontrolled = ctrlMonsSize;
newController = chr;
}
}
@@ -1538,8 +1540,7 @@ public class MapleMap {
objectRLock.lock();
try {
return new LinkedList(mapobjects.values());
}
finally {
} finally {
objectRLock.unlock();
}
}
@@ -1997,8 +1998,9 @@ public class MapleMap {
poisonSchedule = tMan.register(poisonTask, 2000, 2500);
} else {
poisonSchedule = null;
}
tMan.schedule(new Runnable() {
}
Runnable mistSchedule = new Runnable() {
@Override
public void run() {
removeMapObject(mist);
@@ -2007,7 +2009,9 @@ public class MapleMap {
}
broadcastMessage(mist.makeDestroyData());
}
}, duration);
};
this.getChannelServer().registerMobMistCancelAction(mapid, mistSchedule, duration);
}
public void spawnKite(final MapleKite kite) {
@@ -2899,8 +2903,7 @@ public class MapleMap {
}
return mapChars;
}
finally {
} finally {
chrRLock.unlock();
}
}
@@ -2909,8 +2912,7 @@ public class MapleMap {
chrRLock.lock();
try {
return Collections.unmodifiableCollection(this.characters);
}
finally {
} finally {
chrRLock.unlock();
}
}
@@ -2929,7 +2931,7 @@ public class MapleMap {
return null;
}
private void updateMapObjectVisibility(MapleCharacter chr, MapleMapObject mo) {
private static void updateMapObjectVisibility(MapleCharacter chr, MapleMapObject mo) {
if (!chr.isMapObjectVisible(mo)) { // item entered view range
if (mo.getType() == MapleMapObjectType.SUMMON || mo.getPosition().distanceSq(chr.getPosition()) <= getRangedDistance()) {
chr.addVisibleMapObject(mo);
@@ -3291,8 +3293,7 @@ public class MapleMap {
if(characters.isEmpty()) {
return;
}
}
finally {
} finally {
chrRLock.unlock();
}
+3 -2
View File
@@ -33,10 +33,11 @@ import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import tools.locks.MonitoredReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReentrantReadWriteLock;
import provider.MapleData;
import provider.MapleDataProvider;
import provider.MapleDataTool;
@@ -49,7 +50,7 @@ import server.life.MaplePlayerNPCFactory;
import scripting.event.EventInstanceManager;
import tools.DatabaseConnection;
import tools.StringUtil;
import tools.locks.MonitoredLockType;
public class MapleMapFactory {
+2 -2
View File
@@ -25,9 +25,9 @@ import client.MapleClient;
import client.inventory.Item;
import java.awt.Point;
import java.util.concurrent.locks.Lock;
import tools.locks.MonitoredReentrantLock;
import net.server.audit.locks.MonitoredReentrantLock;
import tools.MaplePacketCreator;
import tools.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredLockType;
public class MapleMapItem extends AbstractMapleMapObject {
protected MapleClient ownerClient;
+2 -2
View File
@@ -26,9 +26,9 @@ import java.util.List;
import java.util.ArrayList;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.locks.Lock;
import tools.locks.MonitoredReentrantLock;
import net.server.audit.locks.MonitoredReentrantLock;
import tools.MaplePacketCreator;
import tools.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredLockType;
/**
*
+35 -10
View File
@@ -37,13 +37,12 @@ import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import tools.locks.MonitoredReentrantLock;
import net.server.audit.locks.MonitoredReentrantLock;
import net.opcodes.SendOpcode;
import server.MapleItemInformationProvider;
import tools.MaplePacketCreator;
import tools.Pair;
import tools.data.output.MaplePacketLittleEndianWriter;
import tools.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredLockType;
/**
*
@@ -53,6 +52,8 @@ import tools.locks.MonitoredLockType;
public class MaplePlayerShop extends AbstractMapleMapObject {
private AtomicBoolean open = new AtomicBoolean(false);
private MapleCharacter owner;
private int itemid;
private MapleCharacter[] visitors = new MapleCharacter[3];
private List<MaplePlayerShopItem> items = new ArrayList<>();
private List<SoldItem> sold = new LinkedList<>();
@@ -63,10 +64,11 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
private Map<Integer, Byte> chatSlot = new LinkedHashMap<>();
private Lock visitorLock = new MonitoredReentrantLock(MonitoredLockType.VISITOR_PSHOP, true);
public MaplePlayerShop(MapleCharacter owner, String description) {
public MaplePlayerShop(MapleCharacter owner, String description, int itemid) {
this.setPosition(owner.getPosition());
this.owner = owner;
this.description = description;
this.itemid = itemid;
}
public int getChannel() {
@@ -77,6 +79,10 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
return owner.getMapId();
}
public int getItemId() {
return itemid;
}
public boolean isOpen() {
return open.get();
}
@@ -93,6 +99,22 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
visitorLock.unlock();
}
}
public byte[] getShopRoomInfo() {
visitorLock.lock();
try {
byte count = 0;
for (MapleCharacter visitor : visitors) {
if (visitor != null) {
count++;
}
}
return new byte[]{count, (byte) visitors.length};
} finally {
visitorLock.unlock();
}
}
public boolean isOwner(MapleCharacter c) {
return owner.equals(c);
@@ -103,9 +125,9 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
if (visitors[i] == null) {
visitors[i] = visitor;
visitor.setSlot(i);
this.broadcast(MaplePacketCreator.getPlayerShopNewVisitor(visitor, i + 1));
if(i == 2) visitor.getMap().broadcastMessage(MaplePacketCreator.addCharBox(owner, 1));
owner.getMap().broadcastMessage(MaplePacketCreator.updatePlayerShopBox(this));
break;
}
}
@@ -123,7 +145,9 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
if (visitors[i] != null && visitors[i].getId() == visitor.getId()) {
visitors[i] = null;
visitor.setSlot(-1);
this.broadcast(MaplePacketCreator.getPlayerShopRemoveVisitor(i + 1));
owner.getMap().broadcastMessage(MaplePacketCreator.updatePlayerShopBox(this));
return;
}
}
@@ -154,6 +178,7 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
}
this.broadcastRestoreToVisitors();
owner.getMap().broadcastMessage(MaplePacketCreator.updatePlayerShopBox(this));
return;
}
}
@@ -161,7 +186,7 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
visitorLock.unlock();
}
if(owner.getPlayerShop() != null) visitor.getMap().broadcastMessage(MaplePacketCreator.addCharBox(owner, 4));
owner.getMap().broadcastMessage(MaplePacketCreator.updatePlayerShopBox(this));
}
}
@@ -394,7 +419,7 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
}
public void closeShop() {
owner.getMap().broadcastMessage(MaplePacketCreator.removeCharBox(owner));
owner.getMap().broadcastMessage(MaplePacketCreator.removePlayerShopBox(this));
clearChatLog();
removeVisitors();
}
@@ -527,12 +552,12 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
@Override
public void sendDestroyData(MapleClient client) {
client.announce(MaplePacketCreator.removeCharBox(owner));
client.announce(MaplePacketCreator.removePlayerShopBox(this));
}
@Override
public void sendSpawnData(MapleClient client) {
client.announce(MaplePacketCreator.addCharBox(owner, 4));
client.announce(MaplePacketCreator.updatePlayerShopBox(this));
}
@Override
+2 -2
View File
@@ -29,13 +29,13 @@ import java.util.List;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.locks.Lock;
import tools.locks.MonitoredReentrantLock;
import net.server.audit.locks.MonitoredReentrantLock;
import scripting.reactor.ReactorScriptManager;
import server.TimerManager;
import tools.MaplePacketCreator;
import tools.Pair;
import tools.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredLockType;
/**
*