Coupon buff fix + concurrency fixes

Fixed coupon buff icon not showing properly. Fixed some cases involving
coupons and buff removal not dealing properly with concurrent access.
This commit is contained in:
ronancpl
2017-06-19 17:44:01 -03:00
parent 42fe74955d
commit 7f6d420cf1
58 changed files with 345 additions and 220 deletions

View File

@@ -19,21 +19,11 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.server;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import constants.ServerConstants;
import tools.DatabaseConnection;
import net.server.world.World;
import client.MapleCharacter;
import tools.FilePrinter;
/**
* @author Ronan
@@ -46,7 +36,7 @@ public class CouponWorker implements Runnable {
Server.getInstance().updateActiveCoupons();
Server.getInstance().commitActiveCoupons();
} catch(SQLException sqle) {
sqle.printStackTrace();
FilePrinter.printError(FilePrinter.EXCEPTION_CAUGHT, "Unexpected SQL error: " + sqle.getMessage() + "\n\n");
}
}
}

View File

@@ -167,8 +167,7 @@ public class Server implements Runnable {
for(MapleCharacter chr: world.getPlayerStorage().getAllCharacters()) {
if(!chr.isLoggedin()) continue;
chr.revertCouponRates();
chr.setCouponRates();
chr.updateCouponRates();
}
}
}

View File

@@ -32,21 +32,21 @@ import client.MapleClient;
* @author Matze
*/
public final class MesoDropHandler extends AbstractMaplePacketHandler {//FIX
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
MapleCharacter player = c.getPlayer();
if (!player.isAlive()) {
c.announce(MaplePacketCreator.enableActions());
return;
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
MapleCharacter player = c.getPlayer();
if (!player.isAlive()) {
c.announce(MaplePacketCreator.enableActions());
return;
}
if (!player.canDropMeso()){
player.announce(MaplePacketCreator.serverNotice(5, "Fast meso drop has been patched, cut that out. ;)"));
return;
}
slea.skip(4);
int meso = slea.readInt();
if (meso <= player.getMeso() && meso > 9 && meso < 50001) {
player.gainMeso(-meso, false, true, false);
player.getMap().spawnMesoDrop(meso, player.getPosition(), player, player, true, (byte) 2);
}
}
if (!player.canDropMeso()){
player.announce(MaplePacketCreator.serverNotice(5, "Fast meso drop has been patched, cut that out. ;)"));
return;
}
slea.skip(4);
int meso = slea.readInt();
if (meso <= player.getMeso() && meso > 9 && meso < 50001) {
player.gainMeso(-meso, false, true, false);
player.getMap().spawnMesoDrop(meso, player.getPosition(), player, player, true, (byte) 2);
}
}
}

View File

@@ -269,11 +269,10 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
if (player.getMap().getHPDec() > 0) player.resetHpDecreaseTask();
player.dispelBuffCoupons();
player.resetPlayerRates();
if(ServerConstants.USE_ADD_RATES_BY_LEVEL == true) player.setPlayerRates();
player.setWorldRates();
player.setCouponRates();
player.updateCouponRates();
}
}

View File

@@ -32,9 +32,10 @@ import constants.ServerConstants;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.Set;
@@ -114,12 +115,15 @@ public class World {
}
public void setExpRate(int exp) {
//System.out.println("Setting server EXP Rate to " + exp * ServerConstants.EXP_RATE + "x.");
for(MapleCharacter chr : getPlayerStorage().getAllCharacters()) {
List<MapleCharacter> list = new LinkedList<>(getPlayerStorage().getAllCharacters());
for(MapleCharacter chr : list) {
if(!chr.isLoggedin()) continue;
chr.revertWorldRates();
}
this.exprate = exp;
for(MapleCharacter chr : getPlayerStorage().getAllCharacters()) {
for(MapleCharacter chr : list) {
if(!chr.isLoggedin()) continue;
chr.setWorldRates();
}
}
@@ -129,11 +133,15 @@ public class World {
}
public void setDropRate(int drop) {
for(MapleCharacter chr : getPlayerStorage().getAllCharacters()) {
List<MapleCharacter> list = new LinkedList<>(getPlayerStorage().getAllCharacters());
for(MapleCharacter chr : list) {
if(!chr.isLoggedin()) continue;
chr.revertWorldRates();
}
this.droprate = drop;
for(MapleCharacter chr : getPlayerStorage().getAllCharacters()) {
for(MapleCharacter chr : list) {
if(!chr.isLoggedin()) continue;
chr.setWorldRates();
}
}
@@ -143,11 +151,15 @@ public class World {
}
public void setMesoRate(int meso) {
for(MapleCharacter chr : getPlayerStorage().getAllCharacters()) {
List<MapleCharacter> list = new LinkedList<>(getPlayerStorage().getAllCharacters());
for(MapleCharacter chr : list) {
if(!chr.isLoggedin()) continue;
chr.revertWorldRates();
}
this.mesorate = meso;
for(MapleCharacter chr : getPlayerStorage().getAllCharacters()) {
for(MapleCharacter chr : list) {
if(!chr.isLoggedin()) continue;
chr.setWorldRates();
}
}
@@ -157,13 +169,7 @@ public class World {
}
public void setBossDropRate(int bossdrop) {
for(MapleCharacter chr : getPlayerStorage().getAllCharacters()) {
chr.revertWorldRates();
}
this.bossdroprate = bossdrop;
for(MapleCharacter chr : getPlayerStorage().getAllCharacters()) {
chr.setWorldRates();
}
}
public PlayerStorage getPlayerStorage() {