Compare commits

..

45 Commits

Author SHA1 Message Date
MagicBot de8896ff4e Debugging 2024-08-08 12:29:01 -04:00
MagicBot e579912733 Debugging 2024-08-08 12:28:35 -04:00
MagicBot c7b4404c36 Regex used for strsplit 2024-08-08 12:19:53 -04:00
MagicBot f1de7d413a Hashset initialized 2024-08-08 11:59:10 -04:00
MagicBot cc6f5f5f25 Regex updated with lookahead 2024-08-08 11:56:31 -04:00
MagicBot 19bf75ade8 Regex updated 2024-08-08 11:47:45 -04:00
MagicBot 73eacc3779 Regex updated 2024-08-08 11:38:09 -04:00
MagicBot 69f3504ee9 Regex updated 2024-08-08 11:36:00 -04:00
MagicBot bd89b5e975 Assign result 2024-08-08 11:28:58 -04:00
MagicBot 186eea3099 Regex updated 2024-08-08 11:26:01 -04:00
MagicBot 5e0badef17 EffectModifier pojo work. 2024-08-08 11:21:39 -04:00
MagicBot ea24d493fd Parsing of effect description 2024-08-06 17:18:46 -04:00
MagicBot d12d040def Parsing of effect description 2024-08-06 17:17:57 -04:00
MagicBot 491a9dbae9 Sanitize input 2024-08-06 17:07:07 -04:00
MagicBot 1e0372c40d HashSets for starters. 2024-08-06 16:56:41 -04:00
MagicBot d2f6344846 Regex driven parsing. 2024-08-06 16:52:06 -04:00
FatBoy 47cb824b3f parsing multi worded names 2024-07-24 19:44:29 -05:00
FatBoy 7d8117173f parsing multi worded names 2024-07-24 19:38:28 -05:00
FatBoy 2f076d3215 parsing multi worded names 2024-07-24 19:33:42 -05:00
FatBoy 1a0b8c1d35 parsing multi worded names 2024-07-24 19:31:27 -05:00
FatBoy 887db109c1 parsing multi worded names 2024-07-24 19:31:00 -05:00
FatBoy d8b7f74cd1 attempt to parse 2 worded values 2024-07-24 19:23:18 -05:00
FatBoy b81b4f0e0a attempt to parse 2 worded values 2024-07-24 19:23:04 -05:00
FatBoy 0b4e0d65a9 attempt to parse 2 worded values 2024-07-24 19:14:15 -05:00
FatBoy 2f837ace1e attempt to parse 2 worded values 2024-07-24 19:13:07 -05:00
FatBoy 319d68d15e attempt to parse 2 worded values 2024-07-24 19:09:41 -05:00
FatBoy 2224d811eb attempt to parse 2 worded values 2024-07-24 19:08:41 -05:00
FatBoy 9ec97ce448 attempt to parse 2 worded values 2024-07-24 19:03:49 -05:00
FatBoy f13b8b5d3e attempt to parse 2 worded values 2024-07-24 18:56:29 -05:00
FatBoy 633f5837dc attempt to parse 2 worded values 2024-07-24 18:55:20 -05:00
FatBoy 3238cfa0ff attempt to parse 2 worded values 2024-07-24 18:54:01 -05:00
FatBoy 83b1503cee attempt to parse 2 worded values 2024-07-24 18:51:27 -05:00
MagicBot 6854fad222 Class cleanup 2024-07-24 12:56:24 -04:00
FatBoy 56dd3cfa95 Effects.cfg parser 2024-07-23 21:18:12 -05:00
FatBoy f81a1acb20 Effects.cfg parser 2024-07-23 21:15:37 -05:00
FatBoy 4ed5744707 Effects.cfg parser 2024-07-23 21:11:17 -05:00
FatBoy 085f2816a9 Effects.cfg parser 2024-07-23 21:09:01 -05:00
FatBoy 0526fdef2f Effects.cfg parser 2024-07-23 21:07:29 -05:00
FatBoy 093ee9f59a Effects.cfg parser 2024-07-23 21:02:41 -05:00
FatBoy 1d56b138a5 Effects.cfg parser 2024-07-23 20:57:40 -05:00
FatBoy 419ce3f49c Effects.cfg parser 2024-07-23 20:56:25 -05:00
FatBoy a27f257f80 Effects.cfg parser 2024-07-23 20:53:26 -05:00
FatBoy 8eee7ca23e Effects.cfg parser 2024-07-23 20:51:58 -05:00
FatBoy 28cf0d2232 Effects.cfg parser 2024-07-23 20:48:41 -05:00
FatBoy e12a8a3c7c Effects.cfg parser 2024-07-23 20:47:39 -05:00
11 changed files with 240 additions and 118 deletions
@@ -0,0 +1,6 @@
package engine.ConfigParsing.EffectEntry;
public class Condition {
public String type;
public String value;
}
@@ -0,0 +1,12 @@
package engine.ConfigParsing.EffectEntry;
import java.util.HashSet;
public class EffectEntry {
public String id;
public String name;
public int icon;
public HashSet<String> sources = new HashSet<>();
public HashSet<String> mods;
public HashSet<String> conditions;
}
@@ -0,0 +1,12 @@
package engine.ConfigParsing.EffectEntry;
import engine.mbEnums;
public class Mod {
public mbEnums.ModType type;
public int min;
public int max;
public float scale;
public String slopeType;
public String target;
}
@@ -0,0 +1,88 @@
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2024
// www.magicbane.com
package engine.ConfigParsing;
import engine.ConfigParsing.EffectEntry.EffectEntry;
import engine.gameManager.ConfigManager;
import org.pmw.tinylog.Logger;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class EffectsParser {
public static String EffectsPath = ConfigManager.DEFAULT_DATA_DIR + "wpak/Effects.cfg";
public static HashMap<String, EffectEntry> effect_data = new HashMap<>();
private static final Pattern EFFECT_REGEX = Pattern.compile("(?<=EFFECTBEGIN)(.+?)(?=EFFECTEND)", Pattern.DOTALL);
private static final Pattern SOURCE_REGEX = Pattern.compile("(?<=SOURCEBEGIN)(.+?)(?=SOURCEEND)", Pattern.DOTALL);
private static final Pattern MODS_REGEX = Pattern.compile("(?<=MODSBEGIN)(.+?)(?=MODSEEND)", Pattern.DOTALL);
private static final Pattern STRSPLIT_REGEX = Pattern.compile("([^\"]\\S*|\".+?\")\\s*");
public static void init() throws IOException {
byte[] fileData = Files.readAllBytes(Paths.get(EffectsPath));
String fileContents = new String(fileData);
Matcher matcher = EFFECT_REGEX.matcher(fileContents);
// Iterate effect entries from .wpak config data
while (matcher.find()) {
EffectEntry effectEntry = parseEffectEntry(matcher.group());
if (effectEntry != null)
effect_data.put(effectEntry.id, effectEntry);
}
}
private static EffectEntry parseEffectEntry(String effectData) {
EffectEntry effectEntry = new EffectEntry();
// Remove all lines that contain a # and leading/trailing blanks
effectData = effectData.replaceAll("(?m)^.*#.*\r?\n?", "");
effectData = effectData.trim();
// Parse effect entry description
String firstLine = "";
try {
firstLine = effectData.substring(0, effectData.indexOf('\n'));
} catch (Exception e) {
Logger.error(e);
}
ArrayList<String> effectDescription = new ArrayList<>();
Matcher matcher = STRSPLIT_REGEX.matcher(firstLine);
while (matcher.find())
effectDescription.add(matcher.group(1));
effectEntry.id = effectDescription.get(0);
effectEntry.name = effectDescription.get(1);
effectEntry.icon = Integer.parseInt(effectDescription.get(2));
// Parse source entries
matcher = SOURCE_REGEX.matcher(effectData);
while (matcher.find())
effectEntry.sources.add(matcher.group().trim());
// Parse modifier entries
return effectEntry;
}
}
+1 -1
View File
@@ -798,7 +798,7 @@ public enum BuildingManager {
// Attempt to write to database or delete the building
// if we are destroying it.
if (rank < 0)
if (rank == -1)
success = DbManager.BuildingQueries.DELETE_FROM_DATABASE(building);
else
success = DbManager.BuildingQueries.updateBuildingRank(building, rank);
+1 -1
View File
@@ -2732,7 +2732,7 @@ public class mbEnums {
DIAMOND(1580010, 1540225085, -1730704107, 2000, 20),
GALVOR(1580017, -1683992404, -1596311545, 2000, 5),
IRON(1580002, -1673518119, 2504297, 2000, 20),
LUMBER(1580004, -1628412684, -1603256692, 10000, 100),
LUMBER(1580004, 1628412684, -1603256692, 10000, 100),
MANDRAKE(1580007, 1519910613, 1191391799, 1000, 10),
MITHRIL(1580021, 626743397, -1761257186, 500, 5),
OAK(1580005, -1653034775, 74767, 3000, 30),
+1 -1
View File
@@ -561,7 +561,7 @@ public class Building extends AbstractWorldObject {
BuildingManager.setRank(barracksBuilding, -1);
}
// If the tree is R8 and deranking, we need to update the
// If the tree is R8 and deranking, we need to update it's
// mesh along with buildings losing their health bonus
if (this.rank == 8) {
+4 -10
View File
@@ -41,7 +41,6 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class City extends AbstractWorldObject {
@@ -81,7 +80,6 @@ public class City extends AbstractWorldObject {
private String hash;
public Warehouse warehouse;
public Realm realm;
public AtomicBoolean isDestroyed = new AtomicBoolean(false);
/**
* ResultSet Constructor
@@ -1104,21 +1102,17 @@ public class City extends AbstractWorldObject {
public final void destroy() {
if (this.isDestroyed.compareAndSet(false, true)) {
Thread destroyCityThread = new Thread(new DestroyCityThread(this));
Thread destroyCityThread = new Thread(new DestroyCityThread(this));
destroyCityThread.setName("destroyCity:" + this.getParent().zoneName);
destroyCityThread.start();
} else
Logger.error("Attempt to destroy destroyed city");
destroyCityThread.setName("destroyCity:" + this.getName());
destroyCityThread.start();
}
public final void transfer(AbstractCharacter newOwner) {
Thread transferCityThread = new Thread(new TransferCityThread(this, newOwner));
transferCityThread.setName("TransferCity:" + this.getParent().zoneName);
transferCityThread.setName("TransferCity:" + this.getName());
transferCityThread.start();
}
+2 -1
View File
@@ -220,7 +220,8 @@ public class Mine extends AbstractGameObject {
// Only inactive mines are returned.
for (Mine mine : Mine.mineMap.keySet()) {
if (mine.owningGuild.getObjectUUID() == guildID)
if (mine.owningGuild.getObjectUUID() == guildID &&
mine.isActive == false)
mineList.add(mine);
}
return mineList;
+4 -1
View File
@@ -9,6 +9,7 @@
package engine.server.world;
import engine.ConfigParsing.EffectsParser;
import engine.InterestManagement.RealmMap;
import engine.InterestManagement.WorldGrid;
import engine.db.archive.DataWarehouse;
@@ -76,7 +77,7 @@ public class WorldServer {
super();
}
public static void main(String[] args) {
public static void main(String[] args) throws IOException {
WorldServer worldServer;
@@ -93,6 +94,8 @@ public class WorldServer {
return;
}
EffectsParser.init();
try {
worldServer = new WorldServer();
+109 -103
View File
@@ -53,117 +53,123 @@ public class DestroyCityThread implements Runnable {
// Member variable assignment
try {
cityZone = city.getParent();
newParent = cityZone.parent;
formerGuild = city.getTOL().getGuild();
cityZone = city.getParent();
newParent = cityZone.parent;
formerGuild = city.getTOL().getGuild();
Logger.info("Destroy city thread started for: " + cityZone.zoneName);
// Former guild loses it's tree!
// Former guild loses tree!
if (DbManager.GuildQueries.SET_GUILD_OWNED_CITY(formerGuild.getObjectUUID(), 0)) {
if (DbManager.GuildQueries.SET_GUILD_OWNED_CITY(formerGuild.getObjectUUID(), 0)) {
//Successful Update of guild
//Successful Update of guild
formerGuild.setGuildState(mbEnums.GuildState.Errant);
formerGuild.setNation(null);
formerGuild.setCityUUID(0);
GuildManager.updateAllGuildTags(formerGuild);
GuildManager.updateAllGuildBinds(formerGuild, null);
}
// By losing the tree, the former owners lose all of their subguilds.
if (!formerGuild.getSubGuildList().isEmpty()) {
subGuildList = new ArrayList<>();
subGuildList.addAll(formerGuild.getSubGuildList());
for (Guild subGuild : subGuildList) {
formerGuild.removeSubGuild(subGuild);
}
}
// Build list of buildings within this parent zone
ArrayList<Building> destroySet = new ArrayList<>();
for (Building cityBuilding : cityZone.zoneBuildingSet) {
// Sanity Check in case player deletes the building
// before this thread can get to it
if (cityBuilding == null)
continue;
// Do nothing with the banestone. It will be removed elsewhere
if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.BANESTONE))
continue;
// All buildings are moved to a location relative
// to their new parent zone
localCoords = ZoneManager.worldToLocal(cityBuilding.getLoc(), newParent);
DbManager.BuildingQueries.MOVE_BUILDING(cityBuilding.getObjectUUID(), newParent.getObjectUUID(), localCoords.x, localCoords.y, localCoords.z);
// All buildings are re-parented to a zone one node
// higher in the tree (continent) as we will be
// deleting the city zone very shortly.
if (cityBuilding.getParentZoneID() != newParent.getParentZoneID())
cityBuilding.setParentZone(newParent);
// No longer a tree, no longer any protection contract!
cityBuilding.setProtectionState(mbEnums.ProtectionState.NONE);
// Remove warehouse entry if one exists.
if (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE) {
DbManager.WarehouseQueries.DELETE_WAREHOUSE(city.warehouse);
city.warehouse = null;
}
// Mark all auto protected buildings for destruction
if ((cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.BARRACK) || (cityBuilding.getBlueprint().isWallPiece()) || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SHRINE) || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.TOL) || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SPIRE) || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE))
destroySet.add(cityBuilding);
}
// Destroy set of auto-protected buildings
for (Building building : destroySet)
if (building.getRank() != -1)
BuildingManager.setRank(building, -1);
if (city.realm != null) {
city.realm.removeCity(city.getObjectUUID());
city.realm = null;
}
// It's now safe to delete the city zone from the database
// which will cause a cascade delete of everything else
if (!DbManager.ZoneQueries.DELETE_ZONE(cityZone)) {
Logger.error("DestroyCityThread", "Database error when deleting city zone: " + cityZone.getObjectUUID());
return;
}
// Refresh the city for map requests
City.lastCityUpdate = System.currentTimeMillis();
} catch (Exception e) {
Logger.error(e);
formerGuild.setGuildState(mbEnums.GuildState.Errant);
formerGuild.setNation(null);
formerGuild.setCityUUID(0);
GuildManager.updateAllGuildTags(formerGuild);
GuildManager.updateAllGuildBinds(formerGuild, null);
}
// By losing the tree, the former owners lose all of their subguilds.
if (!formerGuild.getSubGuildList().isEmpty()) {
subGuildList = new ArrayList<>();
subGuildList.addAll(formerGuild.getSubGuildList());
for (Guild subGuild : subGuildList) {
formerGuild.removeSubGuild(subGuild);
}
}
Building tol = null;
// Build list of buildings within this parent zone
for (Building cityBuilding : cityZone.zoneBuildingSet) {
// Sanity Check in case player deletes the building
// before this thread can get to it
if (cityBuilding == null)
continue;
// Do nothing with the banestone. It will be removed elsewhere
if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.BANESTONE))
continue;
// TOL is processed after all other structures in the city zone
if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.TOL)) {
tol = cityBuilding;
continue;
}
// All buildings are moved to a location relative
// to their new parent zone
localCoords = ZoneManager.worldToLocal(cityBuilding.getLoc(), newParent);
DbManager.BuildingQueries.MOVE_BUILDING(cityBuilding.getObjectUUID(), newParent.getObjectUUID(), localCoords.x, localCoords.y, localCoords.z);
// All buildings are re-parented to a zone one node
// higher in the tree (continent) as we will be
// deleting the city zone very shortly.
if (cityBuilding.getParentZoneID() != newParent.getParentZoneID())
cityBuilding.setParentZone(newParent);
// No longer a tree, no longer any protection contract!
cityBuilding.setProtectionState(mbEnums.ProtectionState.NONE);
// Remove warehouse entry if one exists.
if (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE) {
DbManager.WarehouseQueries.DELETE_WAREHOUSE(city.warehouse);
city.warehouse = null;
}
// Destroy all remaining city assets
if ((cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.BARRACK)
|| (cityBuilding.getBlueprint().isWallPiece())
|| (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SHRINE)
|| (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.TOL)
|| (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SPIRE)
|| (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE)) {
if (cityBuilding.getRank() != -1)
BuildingManager.setRank(cityBuilding, -1);
}
}
// Destroy the tol
if (tol != null)
BuildingManager.setRank(tol, -1);
if (city.realm != null)
city.realm.removeCity(city.getObjectUUID());
// It's now safe to delete the city zone from the database
// which will cause a cascade delete of everything else
if (DbManager.ZoneQueries.DELETE_ZONE(cityZone) == false) {
Logger.error("DestroyCityThread", "Database error when deleting city zone: " + cityZone.getObjectUUID());
return;
}
// Refresh the city for map requests
City.lastCityUpdate = System.currentTimeMillis();
// Zone and city should vanish upon next reboot
// if the codebase reaches here.
Logger.info(city.getParent().zoneName + " uuid: " + city.getObjectUUID() + " has been destroyed!");
Logger.info(city.getParent().zoneName + " uuid:" + city.getObjectUUID() + "has been destroyed!");
}
}