Загрузка данных


package zombie.iso;

import fmod.fmod.FMODSoundEmitter;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.logging.Level;
import java.util.logging.Logger;
import se.krka.kahlua.vm.KahluaTable;
import zombie.CollisionManager;
import zombie.FliesSound;
import zombie.GameProfiler;
import zombie.GameTime;
import zombie.GameWindow;
import zombie.IndieGL;
import zombie.MapCollisionData;
import zombie.MovingObjectUpdateScheduler;
import zombie.PersistentOutfits;
import zombie.ReanimatedPlayers;
import zombie.SandboxOptions;
import zombie.SharedDescriptors;
import zombie.SoundManager;
import zombie.SystemDisabler;
import zombie.UsedFromLua;
import zombie.VirtualZombieManager;
import zombie.WorldSoundManager;
import zombie.ZomboidFileSystem;
import zombie.ZomboidGlobals;
import zombie.Lua.LuaEventManager;
import zombie.Lua.LuaManager;
import zombie.Lua.LuaManager.GlobalObject;
import zombie.ai.ZombieGroupManager;
import zombie.ai.states.FakeDeadZombieState;
import zombie.audio.BaseSoundEmitter;
import zombie.audio.DummySoundEmitter;
import zombie.audio.ObjectAmbientEmitters;
import zombie.audio.parameters.ParameterInside;
import zombie.basements.Basements;
import zombie.buildingRooms.BuildingRoomsEditor;
import zombie.characters.AnimalVocalsManager;
import zombie.characters.HaloTextHelper;
import zombie.characters.IsoGameCharacter;
import zombie.characters.IsoPlayer;
import zombie.characters.IsoSurvivor;
import zombie.characters.IsoZombie;
import zombie.characters.SurvivorDesc;
import zombie.characters.ZombieVocalsManager;
import zombie.characters.animals.AnimalDefinitions;
import zombie.characters.animals.AnimalPopulationManager;
import zombie.characters.animals.AnimalTracksDefinitions;
import zombie.characters.animals.AnimalZones;
import zombie.characters.animals.IsoAnimal;
import zombie.characters.professions.CharacterProfessionDefinition;
import zombie.characters.traits.CharacterTraitDefinition;
import zombie.core.Core;
import zombie.core.ImportantAreaManager;
import zombie.core.PZForkJoinPool;
import zombie.core.PerformanceSettings;
import zombie.core.SceneShaderStore;
import zombie.core.SpriteRenderer;
import zombie.core.TilePropertyAliasMap;
import zombie.core.Translator;
import zombie.core.logger.ExceptionLogger;
import zombie.core.math.PZMath;
import zombie.core.physics.WorldSimulation;
import zombie.core.profiling.AbstractPerformanceProfileProbe;
import zombie.core.profiling.PerformanceProfileProbe;
import zombie.core.properties.FasciaEdge;
import zombie.core.properties.IsoPropertyType;
import zombie.core.properties.PropertyContainer;
import zombie.core.random.Rand;
import zombie.core.skinnedmodel.DeadBodyAtlas;
import zombie.core.skinnedmodel.animation.debug.AnimationPlayerRecorder;
import zombie.core.skinnedmodel.model.WorldItemAtlas;
import zombie.core.stash.StashSystem;
import zombie.core.textures.Texture;
import zombie.core.utils.OnceEvery;
import zombie.debug.DebugOptions;
import zombie.debug.DebugType;
import zombie.debug.LineDrawer;
import zombie.debug.LogSeverity;
import zombie.entity.GameEntityManager;
import zombie.entity.components.spriteconfig.SpriteConfigManager;
import zombie.entity.util.TimSort;
import zombie.erosion.ErosionGlobals;
import zombie.gameStates.GameLoadingState;
import zombie.gizmo.Gizmos;
import zombie.globalObjects.GlobalObjectLookup;
import zombie.input.Mouse;
import zombie.inventory.ItemConfigurator;
import zombie.inventory.ItemPickerJava;
import zombie.inventory.types.MapItem;
import zombie.iso.SpriteDetails.IsoFlagType;
import zombie.iso.SpriteDetails.IsoObjectType;
import zombie.iso.areas.DesignationZone;
import zombie.iso.areas.IsoBuilding;
import zombie.iso.areas.SafeHouse;
import zombie.iso.areas.isoregion.IsoRegions;
import zombie.iso.fboRenderChunk.FBORenderAreaHighlights;
import zombie.iso.objects.IsoFireManager;
import zombie.iso.objects.ObjectRenderEffects;
import zombie.iso.objects.RainManager;
import zombie.iso.sprite.IsoSprite;
import zombie.iso.sprite.IsoSpriteGrid;
import zombie.iso.sprite.IsoSpriteManager;
import zombie.iso.sprite.SkyBox;
import zombie.iso.sprite.SpriteGridParseData;
import zombie.iso.weather.ClimateManager;
import zombie.iso.weather.WorldFlares;
import zombie.iso.weather.fog.ImprovedFog;
import zombie.iso.weather.fx.IsoWeatherFX;
import zombie.iso.weather.fx.WeatherFxMask;
import zombie.iso.worldgen.WorldGenChunk;
import zombie.iso.worldgen.WorldGenParams;
import zombie.iso.worldgen.WorldGenParams.Result;
import zombie.iso.worldgen.attachments.AttachmentsHandler;
import zombie.iso.worldgen.blending.Blending;
import zombie.iso.worldgen.maps.BiomeMap;
import zombie.iso.worldgen.rules.Rules;
import zombie.iso.worldgen.zones.ZoneGenerator;
import zombie.iso.zones.Zone;
import zombie.network.BodyDamageSync;
import zombie.network.ClientServerMap;
import zombie.network.GameClient;
import zombie.network.GameServer;
import zombie.network.NetChecksum;
import zombie.network.PassengerMap;
import zombie.network.ServerMap;
import zombie.network.ServerOptions;
import zombie.network.id.ObjectIDManager;
import zombie.pathfind.PolygonalMap2;
import zombie.pathfind.extra.BorderFinderRenderer;
import zombie.pathfind.nativeCode.PathfindNative;
import zombie.pathfind.nativeCode.PathfindNativeRenderer;
import zombie.popman.ZombiePopulationManager;
import zombie.popman.animal.HutchManager;
import zombie.radio.ZomboidRadio;
import zombie.randomizedWorld.RandomizedWorldBase;
import zombie.randomizedWorld.randomizedBuilding.RBBar;
import zombie.randomizedWorld.randomizedBuilding.RBBarn;
import zombie.randomizedWorld.randomizedBuilding.RBBasic;
import zombie.randomizedWorld.randomizedBuilding.RBBurnt;
import zombie.randomizedWorld.randomizedBuilding.RBBurntCorpse;
import zombie.randomizedWorld.randomizedBuilding.RBBurntFireman;
import zombie.randomizedWorld.randomizedBuilding.RBCafe;
import zombie.randomizedWorld.randomizedBuilding.RBClinic;
import zombie.randomizedWorld.randomizedBuilding.RBDorm;
import zombie.randomizedWorld.randomizedBuilding.RBGunstoreSiege;
import zombie.randomizedWorld.randomizedBuilding.RBHairSalon;
import zombie.randomizedWorld.randomizedBuilding.RBHeatBreakAfternoon;
import zombie.randomizedWorld.randomizedBuilding.RBJackieJaye;
import zombie.randomizedWorld.randomizedBuilding.RBJoanHartford;
import zombie.randomizedWorld.randomizedBuilding.RBKateAndBaldspot;
import zombie.randomizedWorld.randomizedBuilding.RBLooted;
import zombie.randomizedWorld.randomizedBuilding.RBMayorWestPoint;
import zombie.randomizedWorld.randomizedBuilding.RBNolans;
import zombie.randomizedWorld.randomizedBuilding.RBOffice;
import zombie.randomizedWorld.randomizedBuilding.RBOther;
import zombie.randomizedWorld.randomizedBuilding.RBPileOCrepe;
import zombie.randomizedWorld.randomizedBuilding.RBPizzaWhirled;
import zombie.randomizedWorld.randomizedBuilding.RBPoliceSiege;
import zombie.randomizedWorld.randomizedBuilding.RBSWATStation;
import zombie.randomizedWorld.randomizedBuilding.RBSafehouse;
import zombie.randomizedWorld.randomizedBuilding.RBSchool;
import zombie.randomizedWorld.randomizedBuilding.RBShopLooted;
import zombie.randomizedWorld.randomizedBuilding.RBSpiffo;
import zombie.randomizedWorld.randomizedBuilding.RBStripclub;
import zombie.randomizedWorld.randomizedBuilding.RBTrashed;
import zombie.randomizedWorld.randomizedBuilding.RBTwiggy;
import zombie.randomizedWorld.randomizedBuilding.RBWoodcraft;
import zombie.randomizedWorld.randomizedBuilding.RandomizedBuildingBase;
import zombie.randomizedWorld.randomizedVehicleStory.RVSAmbulanceCrash;
import zombie.randomizedWorld.randomizedVehicleStory.RVSAnimalOnRoad;
import zombie.randomizedWorld.randomizedVehicleStory.RVSAnimalTrailerOnRoad;
import zombie.randomizedWorld.randomizedVehicleStory.RVSBanditRoad;
import zombie.randomizedWorld.randomizedVehicleStory.RVSBurntCar;
import zombie.randomizedWorld.randomizedVehicleStory.RVSCarCrash;
import zombie.randomizedWorld.randomizedVehicleStory.RVSCarCrashCorpse;
import zombie.randomizedWorld.randomizedVehicleStory.RVSCarCrashDeer;
import zombie.randomizedWorld.randomizedVehicleStory.RVSChangingTire;
import zombie.randomizedWorld.randomizedVehicleStory.RVSConstructionSite;
import zombie.randomizedWorld.randomizedVehicleStory.RVSCrashHorde;
import zombie.randomizedWorld.randomizedVehicleStory.RVSDeadEnd;
import zombie.randomizedWorld.randomizedVehicleStory.RVSFlippedCrash;
import zombie.randomizedWorld.randomizedVehicleStory.RVSHerdOnRoad;
import zombie.randomizedWorld.randomizedVehicleStory.RVSPlonkies;
import zombie.randomizedWorld.randomizedVehicleStory.RVSPoliceBlockade;
import zombie.randomizedWorld.randomizedVehicleStory.RVSPoliceBlockadeShooting;
import zombie.randomizedWorld.randomizedVehicleStory.RVSRegionalProfessionVehicle;
import zombie.randomizedWorld.randomizedVehicleStory.RVSRichJerk;
import zombie.randomizedWorld.randomizedVehicleStory.RVSRoadKill;
import zombie.randomizedWorld.randomizedVehicleStory.RVSRoadKillSmall;
import zombie.randomizedWorld.randomizedVehicleStory.RVSTrailerCrash;
import zombie.randomizedWorld.randomizedVehicleStory.RVSUtilityVehicle;
import zombie.randomizedWorld.randomizedVehicleStory.RandomizedVehicleStoryBase;
import zombie.randomizedWorld.randomizedZoneStory.RZJackieJaye;
import zombie.randomizedWorld.randomizedZoneStory.RZSAttachedAnimal;
import zombie.randomizedWorld.randomizedZoneStory.RZSBBQParty;
import zombie.randomizedWorld.randomizedZoneStory.RZSBaseball;
import zombie.randomizedWorld.randomizedZoneStory.RZSBeachParty;
import zombie.randomizedWorld.randomizedZoneStory.RZSBurntWreck;
import zombie.randomizedWorld.randomizedZoneStory.RZSBuryingCamp;
import zombie.randomizedWorld.randomizedZoneStory.RZSCampsite;
import zombie.randomizedWorld.randomizedZoneStory.RZSCharcoalBurner;
import zombie.randomizedWorld.randomizedZoneStory.RZSDean;
import zombie.randomizedWorld.randomizedZoneStory.RZSDuke;
import zombie.randomizedWorld.randomizedZoneStory.RZSEscapedAnimal;
import zombie.randomizedWorld.randomizedZoneStory.RZSEscapedHerd;
import zombie.randomizedWorld.randomizedZoneStory.RZSFishingTrip;
import zombie.randomizedWorld.randomizedZoneStory.RZSForestCamp;
import zombie.randomizedWorld.randomizedZoneStory.RZSForestCampEaten;
import zombie.randomizedWorld.randomizedZoneStory.RZSFrankHemingway;
import zombie.randomizedWorld.randomizedZoneStory.RZSHermitCamp;
import zombie.randomizedWorld.randomizedZoneStory.RZSHillbillyHoedown;
import zombie.randomizedWorld.randomizedZoneStory.RZSHogWild;
import zombie.randomizedWorld.randomizedZoneStory.RZSHunterCamp;
import zombie.randomizedWorld.randomizedZoneStory.RZSKirstyKormick;
import zombie.randomizedWorld.randomizedZoneStory.RZSMurderScene;
import zombie.randomizedWorld.randomizedZoneStory.RZSMusicFest;
import zombie.randomizedWorld.randomizedZoneStory.RZSMusicFestStage;
import zombie.randomizedWorld.randomizedZoneStory.RZSNastyMattress;
import zombie.randomizedWorld.randomizedZoneStory.RZSOccultActivity;
import zombie.randomizedWorld.randomizedZoneStory.RZSOldFirepit;
import zombie.randomizedWorld.randomizedZoneStory.RZSOldShelter;
import zombie.randomizedWorld.randomizedZoneStory.RZSOrphanedFawn;
import zombie.randomizedWorld.randomizedZoneStory.RZSRangerSmith;
import zombie.randomizedWorld.randomizedZoneStory.RZSRockerParty;
import zombie.randomizedWorld.randomizedZoneStory.RZSSadCamp;
import zombie.randomizedWorld.randomizedZoneStory.RZSSexyTime;
import zombie.randomizedWorld.randomizedZoneStory.RZSSirTwiggy;
import zombie.randomizedWorld.randomizedZoneStory.RZSSurvivalistCamp;
import zombie.randomizedWorld.randomizedZoneStory.RZSTragicPicnic;
import zombie.randomizedWorld.randomizedZoneStory.RZSTrapperCamp;
import zombie.randomizedWorld.randomizedZoneStory.RZSVanCamp;
import zombie.randomizedWorld.randomizedZoneStory.RZSWasteDump;
import zombie.randomizedWorld.randomizedZoneStory.RZSWaterPump;
import zombie.randomizedWorld.randomizedZoneStory.RandomizedZoneStoryBase;
import zombie.savefile.ClientPlayerDB;
import zombie.savefile.PlayerDB;
import zombie.savefile.PlayerDBHelper;
import zombie.savefile.ServerPlayerDB;
import zombie.scripting.ScriptManager;
import zombie.scripting.objects.CharacterTrait;
import zombie.spriteModel.SpriteModelManager;
import zombie.statistics.StatisticsManager;
import zombie.text.templating.TemplateText;
import zombie.tileDepth.TileDepthTextureManager;
import zombie.tileDepth.TileGeometryManager;
import zombie.ui.TutorialManager;
import zombie.util.AddCoopPlayer;
import zombie.util.SharedStrings;
import zombie.util.StringUtils;
import zombie.util.list.PZArrayList;
import zombie.vehicles.BaseVehicle;
import zombie.vehicles.VehicleIDMap;
import zombie.vehicles.VehicleManager;
import zombie.vehicles.VehiclesDB2;
import zombie.viewCone.ViewConeTextureFBO;
import zombie.world.WorldDictionary;
import zombie.world.WorldDictionaryException;
import zombie.world.moddata.GlobalModData;
import zombie.worldMap.network.HiddenAuthors;
import zombie.worldMap.network.WorldMapClient;

@UsedFromLua
public final class IsoWorld {
   private static final int TILESETS_PER_FILE_1 = 1024;
   private static final int TILES_PER_TILESET_1 = 1024;
   private static final int TILES_PER_FILE_1 = 1048576;
   private static final int TILESETS_PER_FILE_OTHER = 512;
   private static final int TILES_PER_TILESET_OTHER = 512;
   private static final int TILES_PER_FILE_OTHER = 262144;
   private static final int NUM_TDEF_FILES_GT_1 = 8188;
   public static final int MIN_TDEF_FILE_NUMBER_FOR_MODS = 100;
   public static final int MAX_TDEF_FILE_NUMBER_FOR_MODS = 8189;
   private static final int TDEF_VERSION1 = 1;
   private static final int TDEF_VERSION_LATEST = 1;
   private static final byte[] TDEF_FILE_MAGIC = new byte[]{116, 100, 101, 102};
   public static final long LUA_CHECKSUM_TIMEOUT_MS;
   private String weather = "sunny";
   public final IsoMetaGrid metaGrid = new IsoMetaGrid();
   private final ArrayList randomizedBuildingList = new ArrayList();
   private final ArrayList randomizedZoneList = new ArrayList();
   private final ArrayList randomizedVehicleStoryList = new ArrayList();
   private final RandomizedBuildingBase rbBasic = new RBBasic();
   private final RandomizedWorldBase randomizedWorldBase = new RandomizedWorldBase();
   private final HashMap spawnedZombieZone = new HashMap();
   private final HashMap allTiles = new HashMap();
   private final ArrayList tileImages = new ArrayList();
   private float flashIsoCursorA = 1.0F;
   private boolean flashIsoCursorInc;
   public SkyBox sky;
   private int timeSinceLastSurvivorInHorde = 4000;
   private int frameNo;
   public final Helicopter helicopter = new Helicopter();
   private boolean hydroPowerOn;
   public final ArrayList characters = new ArrayList();
   private final ArrayDeque freeEmitters = new ArrayDeque();
   private final ArrayList currentEmitters = new ArrayList();
   private final HashMap emitterOwners = new HashMap();
   public int x = 50;
   public int y = 50;
   public IsoCell currentCell;
   public static IsoWorld instance;
   public int totalSurvivorsDead;
   public int totalSurvivorNights;
   public int survivorSurvivalRecord;
   public HashMap survivorDescriptors = new HashMap();
   public ArrayList addCoopPlayers = new ArrayList();
   private static final CompScoreToPlayer compScoreToPlayer;
   public static String mapPath;
   public static boolean mapUseJar;
   private final boolean loaded = false;
   public static final HashMap PropertyValueMap;
   private static final int JUMBO_TRUNK_VARIANT_COUNT = 114;
   private static final int FAKE_JUMBO_TREE_TILESET_INDEX = 12;
   private static int worldX;
   private static int worldY;
   private SurvivorDesc luaDesc;
   private final List luatraits = new ArrayList();
   private int luaPosX = -1;
   private int luaPosY = -1;
   private int luaPosZ = -1;
   private String spawnRegionName = "";
   public static final int WorldVersion = 249;
   public static final int WorldVersion_PreviouslyMoved = 196;
   public static final int WorldVersion_DesignationZone = 197;
   public static final int WorldVersion_PlayerExtraInfoFlags = 198;
   public static final int WorldVersion_ObjectID = 199;
   public static final int WorldVersion_CraftUpdateFoundations = 200;
   public static final int WorldVersion_AlarmDecay = 201;
   public static final int WorldVersion_FishingCheat = 202;
   public static final int WorldVersion_CharacterVoiceType = 203;
   public static final int WorldVersion_AnimalHutch = 204;
   public static final int WorldVersion_AlarmClock = 205;
   public static final int WorldVersion_VariableHeight = 206;
   public static final int WorldVersion_EnableWorldgen = 207;
   public static final int WorldVersion_CharacterVoiceOptions = 208;
   public static final int WorldVersion_ChunksWorldGeneratedBoolean = 209;
   public static final int WorldVersion_ChunksWorldModifiedBoolean = 210;
   public static final int WorldVersion_CharacterDiscomfort = 211;
   public static final int WorldVersion_HutchAndVehicleAnimalFormat = 212;
   public static final int WorldVersion_IsoCompostHealthValues = 213;
   public static final int WorldVersion_ChunksAttachmentsState = 214;
   public static final int WorldVersion_ZoneIDisUUID = 215;
   public static final int WorldVersion_SafeHouseHitPoints = 216;
   public static final int WorldVersion_FastMoveCheat = 217;
   public static final int WorldVersion_SquareSeen = 218;
   public static final int WorldVersion_TrapExplosionDuration = 219;
   public static final int WorldVersion_InventoryItemUsesInteger = 220;
   public static final int WorldVersion_ChunksAttachmentsPartial = 221;
   public static final int WorldVersion_PrintMediaRottingCorpsesBodyDamage = 222;
   public static final int WorldVersion_SafeHouseCreatedTimeAndLocation = 223;
   public static final int WorldVersion_Stats_Idleness = 224;
   public static final int WorldVersion_AnimalRottingTexture = 225;
   public static final int WorldVersion_LearnedRecipes = 226;
   public static final int WorldVersion_BodyDamageSavePoulticeValues = 227;
   public static final int WorldVersion_PlayerSaveCraftingHistory = 228;
   public static final int WorldVersion_VehicleAlarm = 229;
   public static final int WorldVersion_RecipesAndAmmoCheats = 230;
   public static final int WorldVersion_SavePlayerCheats = 231;
   public static final int WorldVersion_ItemWorldRotationFloats = 232;
   public static final int WorldVersion_MetaEntityOutsideAware = 233;
   public static final int WorldVersion_VisitedFileVersion = 234;
   public static final int WorldVersion_VariableCraftInputCounts = 235;
   public static final int WorldVersion_AnimalPetTime = 236;
   public static final int WorldVersion_RootLocale = 237;
   public static final int WorldVersion_CraftLogicParallelCrafting = 238;
   public static final int WorldVersion_PlayerAutoDrink = 239;
   public static final int WorldVersion_42_13 = 240;
   public static final int WorldVersion_PlayerInsulation = 241;
   public static final int WorldVersion_SaveFireTimer = 242;
   public static final int WorldVersion_BodyDamageStatusesSync = 243;
   public static final int WorldVersion_RemoveDifficulty = 244;
   public static final int WorldVersion_AnimalWild = 245;
   public static final int WorldVersion_DeadBodyAnimalGenetics = 246;
   public static final int WorldVersion_AnimalOnlineId = 247;
   public static final int WorldVersion_BuildMaterials = 248;
   public static final int WorldVersion_ThermalDuration = 249;
   public static int savedWorldVersion;
   private boolean drawWorld = true;
   private final PZArrayList zombieWithModel = new PZArrayList(IsoZombie.class, 128);
   private final PZArrayList zombieWithoutModel = new PZArrayList(IsoZombie.class, 128);
   private final TimSort timSort = new TimSort();
   private final ArrayList animalWithModel = new ArrayList();
   private final ArrayList animalWithoutModel = new ArrayList();
   private final Vector2 coneTempo1 = new Vector2();
   private final Vector2 coneTempo2 = new Vector2();
   private final Vector2 coneTempo3 = new Vector2();
   public static boolean noZombies;
   public static int totalWorldVersion;
   public static int saveoffsetx;
   public static int saveoffsety;
   public boolean doChunkMapUpdate = true;
   private long emitterUpdateMs;
   public boolean emitterUpdate;
   private int updateSafehousePlayers = 200;
   public static CompletableFuture animationThread;
   private Rules rules;
   private WorldGenChunk wgChunk;
   private Blending blending;
   private AttachmentsHandler attachmentsHandler;
   private ZoneGenerator zoneGenerator;
   private BiomeMap biomeMap;
   private List zombieVoronois;

   public IsoMetaGrid getMetaGrid() {
      return this.metaGrid;
   }

   public Zone registerZone(String name, String type, int x, int y, int z, int width, int height) {
      return this.metaGrid.registerZone(name, type, x, y, z, width, height);
   }

   /** @deprecated */
   @Deprecated
   public Zone registerZoneNoOverlap(String name, String type, int x, int y, int z, int width, int height) {
      return this.registerZone(name, type, x, y, z, width, height);
   }

   public void removeZonesForLotDirectory(String lotDir) {
      this.metaGrid.removeZonesForLotDirectory(lotDir);
   }

   public BaseSoundEmitter getFreeEmitter() {
      Object e;
      if (this.freeEmitters.isEmpty()) {
         e = Core.soundDisabled ? new DummySoundEmitter() : new FMODSoundEmitter();
      } else {
         e = (BaseSoundEmitter)this.freeEmitters.pop();
      }

      ((BaseSoundEmitter)e).setPlayRemoteEvents(false);
      this.currentEmitters.add(e);
      return (BaseSoundEmitter)e;
   }

   public BaseSoundEmitter getFreeEmitter(float x, float y, float z) {
      BaseSoundEmitter e = this.getFreeEmitter();
      e.setPos(x, y, z);
      return e;
   }

   public void takeOwnershipOfEmitter(BaseSoundEmitter emitter) {
      this.currentEmitters.remove(emitter);
   }

   public void setEmitterOwner(BaseSoundEmitter emitter, IsoObject object) {
      if (emitter != null && object != null) {
         if (!this.emitterOwners.containsKey(emitter)) {
            this.emitterOwners.put(emitter, object);
         }
      }
   }

   public void returnOwnershipOfEmitter(BaseSoundEmitter emitter) {
      if (emitter != null) {
         if (!this.currentEmitters.contains(emitter) && !this.freeEmitters.contains(emitter)) {
            if (emitter.isEmpty()) {
               if (emitter instanceof FMODSoundEmitter) {
                  FMODSoundEmitter fmodSoundEmitter = (FMODSoundEmitter)emitter;
                  fmodSoundEmitter.clearParameters();
               }

               this.freeEmitters.add(emitter);
            } else {
               this.currentEmitters.add(emitter);
            }

         }
      }
   }

   public Zone registerVehiclesZone(String name, String type, int x, int y, int z, int width, int height, KahluaTable properties) {
      return this.metaGrid.registerVehiclesZone(name, type, x, y, z, width, height, properties);
   }

   public Zone registerMannequinZone(String name, String type, int x, int y, int z, int width, int height, KahluaTable properties) {
      return this.metaGrid.registerMannequinZone(name, type, x, y, z, width, height, properties);
   }

   public void registerRoomTone(String name, String type, int x, int y, int z, int width, int height, KahluaTable properties) {
      this.metaGrid.registerRoomTone(name, type, x, y, z, width, height, properties);
   }

   public void registerSpawnOrigin(int x, int y, int width, int height, KahluaTable properties) {
      ZombiePopulationManager.instance.registerSpawnOrigin(x, y, width, height, properties);
   }

   public void registerWaterFlow(float x, float y, float flow, float speed) {
      IsoWaterFlow.addFlow(x, y, flow, speed);
   }

   public void registerWaterZone(float x1, float y1, float x2, float y2, float shore, float waterGround) {
      IsoWaterFlow.addZone(x1, y1, x2, y2, shore, waterGround);
   }

   public void checkVehiclesZones() {
      this.metaGrid.checkVehiclesZones();
   }

   public void setGameMode(String mode) {
      Core.getInstance().setGameMode(mode);
      Core.lastStand = "LastStand".equals(mode);
      Core.getInstance().setChallenge(false);
      Core.challengeId = null;
   }

   public String getGameMode() {
      return Core.gameMode;
   }

   public void setPreset(String mode) {
      Core.preset = mode;
   }

   public String getPreset() {
      return Core.preset;
   }

   public void setWorld(String world) {
      Core.gameSaveWorld = world.trim();
   }

   public void setMap(String world) {
      Core.gameMap = world;
   }

   public String getMap() {
      return Core.gameMap;
   }

   public void renderTerrain() {
   }

   public int getFrameNo() {
      return this.frameNo;
   }

   public IsoSurvivor CreateRandomSurvivor(SurvivorDesc desc, IsoGridSquare sq, IsoPlayer player) {
      return null;
   }

   public void CreateSwarm(int num, int x1, int y1, int x2, int y2) {
   }

   public void ForceKillAllZombies() {
      GameTime.getInstance().RemoveZombiesIndiscriminate(1000);
   }

   public static int readInt(RandomAccessFile in) throws EOFException, IOException {
      int ch1 = in.read();
      int ch2 = in.read();
      int ch3 = in.read();
      int ch4 = in.read();
      if ((ch1 | ch2 | ch3 | ch4) < 0) {
         throw new EOFException();
      } else {
         return (ch1 << 0) + (ch2 << 8) + (ch3 << 16) + (ch4 << 24);
      }
   }

   public static String readString(RandomAccessFile in) throws EOFException, IOException {
      return in.readLine();
   }

   public static int readInt(InputStream in) throws EOFException, IOException {
      int ch1 = in.read();
      int ch2 = in.read();
      int ch3 = in.read();
      int ch4 = in.read();
      if ((ch1 | ch2 | ch3 | ch4) < 0) {
         throw new EOFException();
      } else {
         return (ch1 << 0) + (ch2 << 8) + (ch3 << 16) + (ch4 << 24);
      }
   }

   public static String readString(InputStream in, StringBuilder input) throws IOException {
      input.setLength(0);
      int c = -1;
      boolean eol = false;

      while(!eol) {
         switch (c = in.read()) {
            case -1:
            case 10:
               eol = true;
               break;
            case 13:
               throw new IllegalStateException("\r\n unsupported");
            default:
               input.append((char)c);
         }
      }

      if (c == -1 && input.isEmpty()) {
         return null;
      } else {
         return input.toString();
      }
   }

   private int getSpriteID(int fileNumber, int tilesetNumber, int tileIndex) {
      return fileNumber == 1 ? (tilesetNumber - 1) * 1024 + tileIndex : 1048576 + (fileNumber - 2) * 262144 + (tilesetNumber - 1) * 512 + tileIndex;
   }

   public void LoadTileDefinitions(IsoSpriteManager sprMan, String filename, int fileNumber) {
      DebugType.DetailedInfo.trace("tiledef: loading " + filename);
      boolean bPatch = filename.endsWith(".patch.tiles");
      int maxTilesetsPerFile = fileNumber == 1 ? 1024 : 512;
      int maxTilesPerTileset = fileNumber == 1 ? 1024 : 512;

      try {
         FileInputStream fis = new FileInputStream(filename);

         try {
            BufferedInputStream in = new BufferedInputStream(fis);

            try {
               label889: {
                  byte[] magic = new byte[TDEF_FILE_MAGIC.length];
                  int nBytes = in.read(magic);
                  if (nBytes == TDEF_FILE_MAGIC.length && Arrays.equals(magic, TDEF_FILE_MAGIC)) {
                     int version = readInt((InputStream)in);
                     if (version >= 1 && version <= 1) {
                        int numTilesheets = readInt((InputStream)in);
                        if (numTilesheets >= 0 && numTilesheets <= maxTilesetsPerFile) {
                           SharedStrings sharedStrings = new SharedStrings();
                           StringBuilder stringBuilder = new StringBuilder();
                           boolean saveMovableStatsToFile = false;
                           boolean dumpCustomNameToStdout = false;
                           boolean dumpUntranslatedCustomNameToStdout = Core.debug && Translator.getLanguage() == Translator.getDefaultLanguage();
                           ArrayList buffer = new ArrayList();
                           Map groupMap = new HashMap();
                           Map faceMap = new HashMap();
                           String[] faceNames = new String[]{"N", "E", "S", "W"};

                           for(int i = 0; i < faceNames.length; ++i) {
                              faceMap.put(faceNames[i], new ArrayList());
                           }

                           SpriteGridParseData spriteGridParseData = new SpriteGridParseData();
                           Map uniqueMovables = new HashMap();
                           int movableSpriteCount = 0;
                           int movableOneSpriteCount = 0;
                           int movablesSingleCount = 0;
                           int movablesMultiCount = 0;
                           HashSet customNames = new HashSet();
                           int n = 0;

                           String name;
                           label765:
                           while(n < numTilesheets) {
                              String str = readString(in, stringBuilder);
                              name = str.trim();
                              readString(in, stringBuilder);
                              int wTiles = readInt((InputStream)in);
                              int hTiles = readInt((InputStream)in);
                              int tilesetNumber = readInt((InputStream)in);
                              if (tilesetNumber >= 1 && tilesetNumber <= maxTilesetsPerFile) {
                                 int nTiles = readInt((InputStream)in);
                                 if (nTiles >= 0 && nTiles <= maxTilesPerTileset) {
                                    int i;
                                    ArrayList members;
                                    label756:
                                    for(int m = 0; m < nTiles; ++m) {
                                       String tileName = name + "_" + m;
                                       IsoSprite spr;
                                       int nProps;
                                       int l;
                                       if (bPatch) {
                                          spr = (IsoSprite)sprMan.namedMap.get(tileName);
                                          if (spr == null) {
                                             nProps = readInt((InputStream)in);
                                             l = 0;

                                             while(true) {
                                                if (l >= nProps) {
                                                   continue label756;
                                                }

                                                readString(in, stringBuilder);
                                                readString(in, stringBuilder);
                                                ++l;
                                             }
                                          }
                                       } else {
                                          spr = sprMan.AddSprite(tileName, this.getSpriteID(fileNumber, tilesetNumber, m));
                                       }

                                       if (Core.debug) {
                                          if (this.allTiles.containsKey(name)) {
                                             if (!bPatch) {
                                                ((ArrayList)this.allTiles.get(name)).add(tileName);
                                             }
                                          } else {
                                             members = new ArrayList();
                                             members.add(tileName);
                                             this.allTiles.put(name, members);
                                          }
                                       }

                                       buffer.add(spr);
                                       if (!bPatch) {
                                          spr.setName(tileName);
                                          spr.tilesetName = name;
                                          spr.tileSheetIndex = m;
                                       }

                                       if (spr.name.contains("damaged") || spr.name.contains("trash_")) {
                                          spr.attachedFloor = true;
                                          spr.getProperties().set("attachedFloor", "true");
                                       }

                                       if (spr.name.startsWith("f_bushes") && m <= 31) {
                                          spr.isBush = true;
                                          spr.attachedFloor = true;
                                       }

                                       nProps = readInt((InputStream)in);

                                       for(l = 0; l < nProps; ++l) {
                                          str = readString(in, stringBuilder);
                                          String prop = str.trim();
                                          str = readString(in, stringBuilder);
                                          String val = str.trim();
                                          IsoObjectType type = IsoObjectType.FromString(prop);
                                          if (type == IsoObjectType.MAX) {
                                             prop = sharedStrings.get(prop);
                                             if (prop.equals("firerequirement")) {
                                                spr.firerequirement = Integer.parseInt(val);
                                             } else if (prop.equals("fireRequirement")) {
                                                spr.firerequirement = Integer.parseInt(val);
                                             } else if (prop.equals("BurntTile")) {
                                                spr.burntTile = val;
                                             } else if (prop.equals("ForceAmbient")) {
                                                spr.forceAmbient = true;
                                                spr.getProperties().set(prop, val);
                                             } else if (prop.equals("solidfloor")) {
                                                spr.solidfloor = true;
                                                spr.getProperties().set(prop, val);
                                             } else if (prop.equals("canBeRemoved")) {
                                                spr.canBeRemoved = true;
                                                spr.getProperties().set(prop, val);
                                             } else if (prop.equals("attachedFloor")) {
                                                spr.attachedFloor = true;
                                                spr.getProperties().set(prop, val);
                                             } else if (prop.equals("cutW")) {
                                                spr.cutW = true;
                                                spr.getProperties().set(prop, val);
                                             } else if (prop.equals("cutN")) {
                                                spr.cutN = true;
                                                spr.getProperties().set(prop, val);
                                             } else if (prop.equals("solid")) {
                                                spr.solid = true;
                                                spr.getProperties().set(prop, val);
                                             } else if (prop.equals("solidtrans")) {
                                                spr.solidTrans = true;
                                                spr.getProperties().set(prop, val);
                                             } else if (prop.equals("invisible")) {
                                                spr.invisible = true;
                                                spr.getProperties().set(prop, val);
                                             } else if (prop.equals("alwaysDraw")) {
                                                spr.alwaysDraw = true;
                                                spr.getProperties().set(prop, val);
                                             } else if (prop.equals("FasciaEdge")) {
                                                spr.setFasciaEdge((FasciaEdge)StringUtils.tryParseEnum(FasciaEdge.class, val, (Enum)null));
                                                spr.getProperties().set(prop, val);
                                             } else if (prop.equals("forceRender")) {
                                                spr.forceRender = true;
                                                spr.getProperties().set(prop, val);
                                             } else if ("FloorHeight".equals(prop)) {
                                                if ("OneThird".equals(val)) {
                                                   spr.getProperties().set(IsoFlagType.FloorHeightOneThird);
                                                } else if ("TwoThirds".equals(val)) {
                                                   spr.getProperties().set(IsoFlagType.FloorHeightTwoThirds);
                                                }
                                             } else if (prop.equals("MoveWithWind")) {
                                                spr.moveWithWind = true;
                                                spr.getProperties().set(prop, val);
                                             } else if (prop.equals("WindType")) {
                                                spr.windType = Integer.parseInt(val);
                                                spr.getProperties().set(prop, val);
                                             } else if (prop.equals("RenderLayer")) {
                                                spr.getProperties().set(prop, val);
                                                if ("Default".equals(val)) {
                                                   spr.renderLayer = 0;
                                                } else if ("Floor".equals(val)) {
                                                   spr.renderLayer = 1;
                                                }
                                             } else if (prop.equals("TreatAsWallOrder")) {
                                                spr.treatAsWallOrder = true;
                                                spr.getProperties().set(prop, val);
                                             } else {
                                                spr.getProperties().set(prop, val);
                                                if ("WindowN".equals(prop) || "WindowW".equals(prop)) {
                                                   spr.getProperties().set(prop, val, false);
                                                }
                                             }
                                          } else {
                                             if (spr.getTileType() != IsoObjectType.doorW && spr.getTileType() != IsoObjectType.doorN || type != IsoObjectType.wall) {
                                                spr.setTileType(type);
                                             }

                                             if (type == IsoObjectType.doorW) {
                                                spr.getProperties().set(IsoFlagType.doorW);
                                             } else if (type == IsoObjectType.doorN) {
                                                spr.getProperties().set(IsoFlagType.doorN);
                                             }
                                          }

                                          if (type == IsoObjectType.tree) {
                                             if (spr.name.equals("e_riverbirch_1_1")) {
                                                val = "1";
                                             }

                                             spr.getProperties().set("tree", val);
                                             spr.getProperties().set(IsoFlagType.blocksight);
                                             i = Integer.parseInt(val);
                                             if (name.startsWith("vegetation_trees")) {
                                                i = 4;
                                             }

                                             if (i < 1) {
                                                i = 1;
                                             }

                                             if (i > 4) {
                                                i = 4;
                                             }

                                             if (i == 1 || i == 2) {
                                                spr.getProperties().unset(IsoFlagType.blocksight);
                                             }

                                             spr.getProperties().set("MaterialType", "Wood_Solid");
                                          }

                                          if (prop.equals("interior") && val.equals("false")) {
                                             spr.getProperties().set(IsoFlagType.exterior);
                                          }

                                          if (prop.equals("HoppableN")) {
                                             spr.getProperties().set(IsoFlagType.collideN);
                                             spr.getProperties().set(IsoFlagType.canPathN);
                                             spr.getProperties().set(IsoFlagType.transparentN);
                                          }

                                          if (prop.equals("HoppableW")) {
                                             spr.getProperties().set(IsoFlagType.collideW);
                                             spr.getProperties().set(IsoFlagType.canPathW);
                                             spr.getProperties().set(IsoFlagType.transparentW);
                                          }

                                          if (prop.equals("WallN")) {
                                             spr.getProperties().set(IsoFlagType.collideN);
                                             spr.getProperties().set(IsoFlagType.cutN);
                                             spr.setTileType(IsoObjectType.wall);
                                             spr.cutN = true;
                                             spr.getProperties().set("WallN", "", false);
                                          }

                                          if (prop.equals("CantClimb")) {
                                             spr.getProperties().set(IsoFlagType.CantClimb);
                                          } else if (IsoPropertyType.CONTAINER.isProperty(prop)) {
                                             spr.getProperties().set(prop, val, false);
                                          } else if (prop.equals("WallNTrans")) {
                                             spr.getProperties().set(IsoFlagType.collideN);
                                             spr.getProperties().set(IsoFlagType.cutN);
                                             spr.getProperties().set(IsoFlagType.transparentN);
                                             spr.setTileType(IsoObjectType.wall);
                                             spr.cutN = true;
                                             spr.getProperties().set("WallNTrans", "", false);
                                          } else if (prop.equals("WallW")) {
                                             spr.getProperties().set(IsoFlagType.collideW);
                                             spr.getProperties().set(IsoFlagType.cutW);
                                             spr.setTileType(IsoObjectType.wall);
                                             spr.cutW = true;
                                             spr.getProperties().set("WallW", "", false);
                                          } else if (prop.equals("windowN")) {
                                             spr.getProperties().set("WindowN", "WindowN");
                                             spr.getProperties().set(IsoFlagType.transparentN);
                                             spr.getProperties().set("WindowN", "WindowN", false);
                                          } else if (prop.equals("windowW")) {
                                             spr.getProperties().set("WindowW", "WindowW");
                                             spr.getProperties().set(IsoFlagType.transparentW);
                                             spr.getProperties().set("WindowW", "WindowW", false);
                                          } else if (prop.equals("cutW")) {
                                             spr.getProperties().set(IsoFlagType.cutW);
                                             spr.cutW = true;
                                          } else if (prop.equals("cutN")) {
                                             spr.getProperties().set(IsoFlagType.cutN);
                                             spr.cutN = true;
                                          } else if (prop.equals("WallWTrans")) {
                                             spr.getProperties().set(IsoFlagType.collideW);
                                             spr.getProperties().set(IsoFlagType.transparentW);
                                             spr.getProperties().set(IsoFlagType.cutW);
                                             spr.setTileType(IsoObjectType.wall);
                                             spr.cutW = true;
                                             spr.getProperties().set("WallWTrans", "", false);
                                          } else if (prop.equals("DoorWallN")) {
                                             spr.getProperties().set(IsoFlagType.cutN);
                                             spr.cutN = true;
                                             spr.getProperties().set("DoorWallN", "", false);
                                          } else if (prop.equals("DoorWallNTrans")) {
                                             spr.getProperties().set(IsoFlagType.cutN);
                                             spr.getProperties().set(IsoFlagType.transparentN);
                                             spr.cutN = true;
                                             spr.getProperties().set("DoorWallNTrans", "", false);
                                          } else if (prop.equals("DoorWallW")) {
                                             spr.getProperties().set(IsoFlagType.cutW);
                                             spr.cutW = true;
                                             spr.getProperties().set("DoorWallW", "", false);
                                          } else if (prop.equals("DoorWallWTrans")) {
                                             spr.getProperties().set(IsoFlagType.cutW);
                                             spr.getProperties().set(IsoFlagType.transparentW);
                                             spr.cutW = true;
                                             spr.getProperties().set("DoorWallWTrans", "", false);
                                          } else if (prop.equals("WallNW")) {
                                             spr.getProperties().set(IsoFlagType.collideN);
                                             spr.getProperties().set(IsoFlagType.cutN);
                                             spr.getProperties().set(IsoFlagType.collideW);
                                             spr.getProperties().set(IsoFlagType.cutW);
                                             spr.setTileType(IsoObjectType.wall);
                                             spr.cutW = true;
                                             spr.cutN = true;
                                             spr.getProperties().set("WallNW", "", false);
                                          } else if (prop.equals("WallNWTrans")) {
                                             spr.getProperties().set(IsoFlagType.collideN);
                                             spr.getProperties().set(IsoFlagType.cutN);
                                             spr.getProperties().set(IsoFlagType.collideW);
                                             spr.getProperties().set(IsoFlagType.transparentN);
                                             spr.getProperties().set(IsoFlagType.transparentW);
                                             spr.getProperties().set(IsoFlagType.cutW);
                                             spr.setTileType(IsoObjectType.wall);
                                             spr.cutW = true;
                                             spr.cutN = true;
                                             spr.getProperties().set("WallNWTrans", "", false);
                                          } else if (prop.equals("WallSE")) {
                                             spr.getProperties().set(IsoFlagType.cutW);
                                             spr.getProperties().set(IsoFlagType.WallSE);
                                             spr.getProperties().set("WallSE", "WallSE");
                                             spr.cutW = true;
                                          } else if (prop.equals("WindowW")) {
                                             spr.getProperties().set(IsoFlagType.canPathW);
                                             spr.getProperties().set(IsoFlagType.collideW);
                                             spr.getProperties().set(IsoFlagType.cutW);
                                             spr.getProperties().set(IsoFlagType.transparentW);
                                             spr.setTileType(IsoObjectType.windowFW);
                                             if (spr.getProperties().has(IsoFlagType.HoppableW)) {
                                                DebugType.Moveable.error("ERROR: WindowW sprite shouldn't have HoppableW (%s)", new Object[]{spr.getName()});
                                                spr.getProperties().unset(IsoFlagType.HoppableW);
                                             }

                                             spr.cutW = true;
                                          } else if (prop.equals("WindowN")) {
                                             spr.getProperties().set(IsoFlagType.canPathN);
                                             spr.getProperties().set(IsoFlagType.collideN);
                                             spr.getProperties().set(IsoFlagType.cutN);
                                             spr.getProperties().set(IsoFlagType.transparentN);
                                             spr.setTileType(IsoObjectType.windowFN);
                                             if (spr.getProperties().has(IsoFlagType.HoppableN)) {
                                                DebugType.Moveable.error("ERROR: WindowN sprite shouldn't have HoppableN (%s)", new Object[]{spr.getName()});
                                                spr.getProperties().unset(IsoFlagType.HoppableN);
                                             }

                                             spr.cutN = true;
                                          } else if (prop.equals("UnbreakableWindowW")) {
                                             spr.getProperties().set(IsoFlagType.canPathW);
                                             spr.getProperties().set(IsoFlagType.collideW);
                                             spr.getProperties().set(IsoFlagType.cutW);
                                             spr.getProperties().set(IsoFlagType.transparentW);
                                             spr.getProperties().set(IsoFlagType.collideW);
                                             spr.setTileType(IsoObjectType.wall);
                                             spr.cutW = true;
                                          } else if (prop.equals("UnbreakableWindowN")) {
                                             spr.getProperties().set(IsoFlagType.canPathN);
                                             spr.getProperties().set(IsoFlagType.collideN);
                                             spr.getProperties().set(IsoFlagType.cutN);
                                             spr.getProperties().set(IsoFlagType.transparentN);
                                             spr.getProperties().set(IsoFlagType.collideN);
                                             spr.setTileType(IsoObjectType.wall);
                                             spr.cutN = true;
                                          } else if (prop.equals("UnbreakableWindowNW")) {
                                             spr.getProperties().set(IsoFlagType.cutN);
                                             spr.getProperties().set(IsoFlagType.transparentN);
                                             spr.getProperties().set(IsoFlagType.collideN);
                                             spr.getProperties().set(IsoFlagType.cutN);
                                             spr.getProperties().set(IsoFlagType.collideW);
                                             spr.getProperties().set(IsoFlagType.cutW);
                                             spr.setTileType(IsoObjectType.wall);
                                             spr.cutW = true;
                                             spr.cutN = true;
                                          } else if ("NoWallLighting".equals(prop)) {
                                             spr.getProperties().set(IsoFlagType.NoWallLighting);
                                          } else if ("ForceAmbient".equals(prop)) {
                                             spr.getProperties().set(IsoFlagType.ForceAmbient);
                                          }

                                          if (prop.equals("name")) {
                                             spr.setParentObjectName(val);
                                          }
                                       }

                                       if (spr.getProperties().has(IsoPropertyType.RED_LIGHT) || spr.getProperties().has(IsoPropertyType.GREEN_LIGHT) || spr.getProperties().has(IsoPropertyType.BLUE_LIGHT)) {
                                          if (!spr.getProperties().has(IsoPropertyType.RED_LIGHT)) {
                                             spr.getProperties().set(IsoPropertyType.RED_LIGHT, "0");
                                          }

                                          if (!spr.getProperties().has(IsoPropertyType.GREEN_LIGHT)) {
                                             spr.getProperties().set(IsoPropertyType.GREEN_LIGHT, "0");
                                          }

                                          if (!spr.getProperties().has(IsoPropertyType.BLUE_LIGHT)) {
                                             spr.getProperties().set(IsoPropertyType.BLUE_LIGHT, "0");
                                          }
                                       }

                                       spr.getProperties().CreateKeySet();
                                       if (Core.debug && spr.getProperties().has(IsoPropertyType.SMASHED_TILE_OFFSET) && !spr.getProperties().has(IsoPropertyType.GLASS_REMOVED_OFFSET)) {
                                          DebugType.Sprite.error("Window sprite has SmashedTileOffset but no GlassRemovedOffset (" + spr.getName() + ")");
                                       }
                                    }

                                    this.setOpenDoorProperties(name, buffer);
                                    groupMap.clear();
                                    Iterator var65 = buffer.iterator();

                                    String fullgroup;
                                    while(var65.hasNext()) {
                                       IsoSprite spr = (IsoSprite)var65.next();
                                       if (spr.getProperties().has("StopCar") && spr.getTileType() != IsoObjectType.tree) {
                                          spr.setTileType(IsoObjectType.isMoveAbleObject);
                                       }

                                       String var10000;
                                       if (spr.getProperties().has("IsMoveAble")) {
                                          if (spr.getProperties().has(IsoPropertyType.CUSTOM_NAME) && !spr.getProperties().get(IsoPropertyType.CUSTOM_NAME).equals("")) {
                                             ++movableSpriteCount;
                                             if (spr.getProperties().has(IsoPropertyType.GROUP_NAME)) {
                                                var10000 = spr.getProperties().get(IsoPropertyType.GROUP_NAME);
                                                fullgroup = var10000 + " " + spr.getProperties().get(IsoPropertyType.CUSTOM_NAME);
                                                if (!groupMap.containsKey(fullgroup)) {
                                                   groupMap.put(fullgroup, new ArrayList());
                                                }

                                                ((ArrayList)groupMap.get(fullgroup)).add(spr);
                                                customNames.add(fullgroup);
                                             } else {
                                                if (!uniqueMovables.containsKey(name)) {
                                                   uniqueMovables.put(name, new ArrayList());
                                                }

                                                if (!((ArrayList)uniqueMovables.get(name)).contains(spr.getProperties().get(IsoPropertyType.CUSTOM_NAME))) {
                                                   ((ArrayList)uniqueMovables.get(name)).add(spr.getProperties().get(IsoPropertyType.CUSTOM_NAME));
                                                }

                                                ++movableOneSpriteCount;
                                                customNames.add(spr.getProperties().get(IsoPropertyType.CUSTOM_NAME));
                                             }
                                          } else {
                                             DebugType.Moveable.println("[IMPORTANT] MOVABLES: Object has no custom name defined: sheet = " + name);
                                          }
                                       } else if (spr.getProperties().has("SpriteGridPos")) {
                                          if (StringUtils.isNullOrWhitespace(spr.getProperties().get(IsoPropertyType.CUSTOM_NAME))) {
                                             DebugType.Moveable.println("[IMPORTANT] MOVABLES: Object has no custom name defined: sheet = " + name);
                                          } else if (spr.getProperties().has(IsoPropertyType.GROUP_NAME)) {
                                             var10000 = spr.getProperties().get(IsoPropertyType.GROUP_NAME);
                                             fullgroup = var10000 + " " + spr.getProperties().get(IsoPropertyType.CUSTOM_NAME);
                                             if (!groupMap.containsKey(fullgroup)) {
                                                groupMap.put(fullgroup, new ArrayList());
                                             }

                                             ((ArrayList)groupMap.get(fullgroup)).add(spr);
                                          }
                                       }
                                    }

                                    var65 = groupMap.entrySet().iterator();

                                    while(true) {
                                       while(true) {
                                          while(true) {
                                             String faceName;
                                             int var47;
                                             boolean isSpriteGrid;
                                             boolean isValid;
                                             IsoSprite current;
                                             int sprCount;
                                             Iterator var79;
                                             do {
                                                if (!var65.hasNext()) {
                                                   buffer.clear();
                                                   ++n;
                                                   continue label765;
                                                }

                                                Map.Entry entry = (Map.Entry)var65.next();
                                                fullgroup = (String)entry.getKey();
                                                if (!uniqueMovables.containsKey(name)) {
                                                   uniqueMovables.put(name, new ArrayList());
                                                }

                                                if (!((ArrayList)uniqueMovables.get(name)).contains(fullgroup)) {
                                                   ((ArrayList)uniqueMovables.get(name)).add(fullgroup);
                                                }

                                                members = (ArrayList)entry.getValue();
                                                if (members.size() == 1) {
                                                   DebugType.Moveable.debugln("MOVABLES: Object has only one face defined for group: (" + fullgroup + ") sheet = " + name);
                                                }

                                                if (members.size() == 3) {
                                                   DebugType.Moveable.debugln("MOVABLES: Object only has 3 sprites, _might_ have a error in settings, group: (" + fullgroup + ") sheet = " + name);
                                                }

                                                String[] var70 = faceNames;
                                                int var72 = faceNames.length;

                                                for(sprCount = 0; sprCount < var72; ++sprCount) {
                                                   String faceName = var70[sprCount];
                                                   ((ArrayList)faceMap.get(faceName)).clear();
                                                }

                                                isSpriteGrid = ((IsoSprite)members.get(0)).getProperties().has("SpriteGridPos") && !((IsoSprite)members.get(0)).getProperties().get("SpriteGridPos").equals("None");
                                                isValid = true;
                                                var79 = members.iterator();

                                                while(var79.hasNext()) {
                                                   current = (IsoSprite)var79.next();
                                                   boolean testIsSpriteGrid = current.getProperties().has("SpriteGridPos") && !current.getProperties().get("SpriteGridPos").equals("None");
                                                   if (isSpriteGrid != testIsSpriteGrid) {
                                                      isValid = false;
                                                      DebugType.Moveable.debugln("MOVABLES: Difference in SpriteGrid settings for members of group: (" + fullgroup + ") sheet = " + name);
                                                      break;
                                                   }

                                                   if (!current.getProperties().has(IsoPropertyType.FACING)) {
                                                      isValid = false;
                                                   } else {
                                                      switch (current.getProperties().get(IsoPropertyType.FACING)) {
                                                         case "N":
                                                            ((ArrayList)faceMap.get("N")).add(current);
                                                            break;
                                                         case "E":
                                                            ((ArrayList)faceMap.get("E")).add(current);
                                                            break;
                                                         case "S":
                                                            ((ArrayList)faceMap.get("S")).add(current);
                                                            break;
                                                         case "W":
                                                            ((ArrayList)faceMap.get("W")).add(current);
                                                            break;
                                                         default:
                                                            DebugType.Moveable.debugln("MOVABLES: Invalid face (" + current.getProperties().get(IsoPropertyType.FACING) + ") for group: (" + fullgroup + ") sheet = " + name);
                                                            isValid = false;
                                                      }
                                                   }

                                                   if (!isValid) {
                                                      DebugType.Moveable.debugln("MOVABLES: Not all members have a valid face defined for group: (" + fullgroup + ") sheet = " + name);
                                                      break;
                                                   }
                                                }
                                             } while(!isValid);

                                             if (!isSpriteGrid) {
                                                if (members.size() > 4) {
                                                   DebugType.Moveable.debugln("MOVABLES: Object has too many faces defined for group: (" + fullgroup + ") sheet = " + name);
                                                } else {
                                                   String[] var83 = faceNames;
                                                   int var78 = faceNames.length;

                                                   for(i = 0; i < var78; ++i) {
                                                      faceName = var83[i];
                                                      if (((ArrayList)faceMap.get(faceName)).size() > 1) {
                                                         DebugType.Moveable.debugln("MOVABLES: " + faceName + " face defined more than once for group: (" + fullgroup + ") sheet = " + name);
                                                         isValid = false;
                                                      }
                                                   }

                                                   if (isValid) {
                                                      ++movablesSingleCount;
                                                      var79 = members.iterator();

                                                      while(var79.hasNext()) {
                                                         current = (IsoSprite)var79.next();
                                                         String[] var90 = faceNames;
                                                         int var84 = faceNames.length;

                                                         for(var47 = 0; var47 < var84; ++var47) {
                                                            String faceName = var90[var47];
                                                            ArrayList direction = (ArrayList)faceMap.get(faceName);
                                                            if (!direction.isEmpty() && direction.get(0) != current) {
                                                               current.getProperties().set(faceName + "offset", Integer.toString(buffer.indexOf(direction.get(0)) - buffer.indexOf(current)));
                                                            }
                                                         }
                                                      }
                                                   }
                                                }
                                             } else {
                                                sprCount = 0;
                                                IsoSpriteGrid[] grids = new IsoSpriteGrid[faceNames.length];

                                                int j;
                                                IsoSprite anchorSprite;
                                                for(i = 0; i < faceNames.length; ++i) {
                                                   ArrayList direction = (ArrayList)faceMap.get(faceNames[i]);
                                                   if (!direction.isEmpty()) {
                                                      if (sprCount == 0) {
                                                         sprCount = direction.size();
                                                      }

                                                      if (sprCount != direction.size()) {
                                                         DebugType.Moveable.debugln("MOVABLES: Sprite count mismatch for multi sprite movable, group: (" + fullgroup + ") sheet = " + name);
                                                         isValid = false;
                                                         break;
                                                      }

                                                      spriteGridParseData.clear();

                                                      SpriteGridParseData.Level levelData;
                                                      Iterator var87;
                                                      for(var87 = direction.iterator(); var87.hasNext(); spriteGridParseData.height = PZMath.max(spriteGridParseData.height, levelData.height)) {
                                                         IsoSprite mem = (IsoSprite)var87.next();
                                                         String pos = mem.getProperties().get("SpriteGridPos");
                                                         String[] parts = pos.split(",");
                                                         if (parts.length < 2 || parts.length > 3) {
                                                            DebugType.Moveable.debugln("MOVABLES: SpriteGrid position error for multi sprite movable, group: (" + fullgroup + ") sheet = " + name);
                                                            isValid = false;
                                                            break;
                                                         }

                                                         j = Integer.parseInt(parts[0]);
                                                         int y = Integer.parseInt(parts[1]);
                                                         int spriteGridZ = 0;
                                                         if (parts.length == 3) {
                                                            spriteGridZ = Integer.parseInt(parts[2]);
                                                         }

                                                         if (mem.getProperties().has("SpriteGridLevel")) {
                                                            spriteGridZ = Integer.parseInt(mem.getProperties().get("SpriteGridLevel"));
                                                            if (spriteGridZ < 0) {
                                                               DebugType.Moveable.debugln("MOVABLES: invalid SpriteGirdLevel for multi sprite movable, group: (" + fullgroup + ") sheet = " + name);
                                                               isValid = false;
                                                               break;
                                                            }
                                                         }

                                                         levelData = spriteGridParseData.getOrCreateLevel(spriteGridZ);
                                                         if (levelData.xyToSprite.containsKey(pos)) {
                                                            DebugType.Moveable.debugln("MOVABLES: double SpriteGrid position (" + pos + ") for multi sprite movable, group: (" + fullgroup + ") sheet = " + name);
                                                            isValid = false;
                                                            break;
                                                         }

                                                         levelData.xyToSprite.put(pos, mem);
                                                         levelData.width = PZMath.max(levelData.width, j + 1);
                                                         levelData.height = PZMath.max(levelData.height, y + 1);
                                                         spriteGridParseData.width = PZMath.max(spriteGridParseData.width, levelData.width);
                                                      }

                                                      if (!isValid) {
                                                         break;
                                                      }

                                                      if (!spriteGridParseData.isValid()) {
                                                         DebugType.Moveable.debugln("MOVABLES: SpriteGrid dimensions error for multi sprite movable, group: (" + fullgroup + ") sheet = " + name);
                                                         isValid = false;
                                                         break;
                                                      }

                                                      grids[i] = new IsoSpriteGrid(spriteGridParseData.width, spriteGridParseData.height, spriteGridParseData.levels.size());
                                                      var87 = spriteGridParseData.levels.iterator();

                                                      while(var87.hasNext()) {
                                                         SpriteGridParseData.Level levelData = (SpriteGridParseData.Level)var87.next();
                                                         Iterator var89 = levelData.xyToSprite.entrySet().iterator();

                                                         while(var89.hasNext()) {
                                                            Map.Entry entry1 = (Map.Entry)var89.next();
                                                            String pos = (String)entry1.getKey();
                                                            anchorSprite = (IsoSprite)entry1.getValue();
                                                            String[] parts = pos.split(",");
                                                            int x = Integer.parseInt(parts[0]);
                                                            int y = Integer.parseInt(parts[1]);
                                                            grids[i].setSprite(x, y, levelData.z, anchorSprite);
                                                         }
                                                      }

                                                      if (!grids[i].validate()) {
                                                         DebugType.Moveable.debugln("MOVABLES: SpriteGrid didn't validate for multi sprite movable, group: (" + fullgroup + ") sheet = " + name);
                                                         isValid = false;
                                                         break;
                                                      }
                                                   }
                                                }

                                                if (isValid && sprCount != 0) {
                                                   ++movablesMultiCount;

                                                   for(i = 0; i < faceNames.length; ++i) {
                                                      IsoSpriteGrid grid = grids[i];
                                                      if (grid != null) {
                                                         IsoSprite[] var91 = grid.getSprites();
                                                         int var86 = var91.length;

                                                         for(int var92 = 0; var92 < var86; ++var92) {
                                                            IsoSprite member = var91[var92];
                                                            if (member != null) {
                                                               member.setSpriteGrid(grid);

                                                               for(j = 0; j < faceNames.length; ++j) {
                                                                  if (j != i && grids[j] != null) {
                                                                     anchorSprite = grids[j].getAnchorSprite();
                                                                     member.getProperties().set(faceNames[j] + "offset", Integer.toString(anchorSprite.tileSheetIndex - member.tileSheetIndex));
                                                                  }
                                                               }
                                                            }
                                                         }
                                                      }
                                                   }
                                                } else {
                                                   DebugType.Moveable.debugln("MOVABLES: Error in multi sprite movable, group: (" + fullgroup + ") sheet = " + name);
                                                }
                                             }
                                          }
                                       }
                                    }
                                 }

                                 throw new IOException("%s: invalid number of tiles %d, must be from 0 to %d in %s".formatted(filename, nTiles, maxTilesPerTileset, name));
                              }

                              throw new IOException("%s: invalid tileset number %d, must be from 1 to %d in %s".formatted(filename, tilesetNumber, maxTilesetsPerFile, name));
                           }

                           if (dumpUntranslatedCustomNameToStdout) {
                              ArrayList customNamesSorted = new ArrayList(customNames);
                              Collections.sort(customNamesSorted);
                              StringBuilder sb = new StringBuilder();
                              Iterator var64 = customNamesSorted.iterator();

                              while(var64.hasNext()) {
                                 String customName = (String)var64.next();
                                 if (Translator.getMoveableDisplayNameOrNull(customName) == null) {
                                    String var10001 = customName.replaceAll(" ", "_").replaceAll("-", "_").replaceAll("'", "").replaceAll("\\.", "");
                                    sb.append(var10001 + " = \"" + customName + "\",\n");
                                 }
                              }

                              name = sb.toString();
                              if (!name.isEmpty() && Core.debug) {
                                 DebugType.Translation.debugln("Missing translations in Moveables_EN.txt:\n" + name);
                              }
                           }
                           break label889;
                        }

                        throw new IOException("%s: invalid number of tilesets %d, must be from 0 to %d".formatted(filename, numTilesheets, maxTilesetsPerFile));
                     }

                     throw new IOException("%s: invalid version %d, must be from %d to %d".formatted(filename, version, 1, 1));
                  }

                  throw new IOException("not magic");
               }
            } catch (Throwable var58) {
               try {
                  in.close();
               } catch (Throwable var57) {
                  var58.addSuppressed(var57);
               }

               throw var58;
            }

            in.close();
         } catch (Throwable var59) {
            try {
               fis.close();
            } catch (Throwable var56) {
               var59.addSuppressed(var56);
            }

            throw var59;
         }

         fis.close();
      } catch (Exception var60) {
         ExceptionLogger.logException(var60);
      }

   }

   private void GenerateTilePropertyLookupTables() {
      TilePropertyAliasMap.instance.Generate(PropertyValueMap);
      PropertyValueMap.clear();
   }

   public void LoadTileDefinitionsPropertyStrings(IsoSpriteManager sprMan, String filename, int fileNumber) {
      DebugType.DetailedInfo.trace("tiledef: loading " + filename);
      if (!GameServer.server) {
         Thread.yield();
         Core.getInstance().DoFrameReady();
      }

      int maxTilesetsPerFile = fileNumber == 1 ? 1024 : 512;
      int maxTilesPerTileset = fileNumber == 1 ? 1024 : 512;

      try {
         FileInputStream fis = new FileInputStream(filename);

         try {
            BufferedInputStream in = new BufferedInputStream(fis);

            try {
               label144: {
                  byte[] magic = new byte[TDEF_FILE_MAGIC.length];
                  int nBytes = in.read(magic);
                  if (nBytes == TDEF_FILE_MAGIC.length && Arrays.equals(magic, TDEF_FILE_MAGIC)) {
                     int version = readInt((InputStream)in);
                     if (version >= 1 && version <= 1) {
                        int numTilesheets = readInt((InputStream)in);
                        if (numTilesheets < 0 || numTilesheets > maxTilesetsPerFile) {
                           throw new IOException("%s: invalid number of tilesets %d, must be from 0 to %d".formatted(filename, numTilesheets, maxTilesetsPerFile));
                        }

                        SharedStrings sharedStrings = new SharedStrings();
                        StringBuilder stringBuilder = new StringBuilder();
                        int n = 0;

                        while(n < numTilesheets) {
                           String str = readString(in, stringBuilder);
                           String name = str.trim();
                           String imageName = readString(in, stringBuilder);
                           this.tileImages.add(imageName);
                           int wTiles = readInt((InputStream)in);
                           int hTiles = readInt((InputStream)in);
                           int tilesetNumber = readInt((InputStream)in);
                           if (tilesetNumber >= 1 && tilesetNumber <= maxTilesetsPerFile) {
                              int nTiles = readInt((InputStream)in);
                              if (nTiles >= 0 && nTiles <= maxTilesPerTileset) {
                                 for(int m = 0; m < nTiles; ++m) {
                                    int nProps = readInt((InputStream)in);

                                    for(int l = 0; l < nProps; ++l) {
                                       str = readString(in, stringBuilder);
                                       String prop = str.trim();
                                       str = readString(in, stringBuilder);
                                       String val = str.trim();
                                       prop = sharedStrings.get(prop);
                                       ArrayList values;
                                       if (PropertyValueMap.containsKey(prop)) {
                                          values = (ArrayList)PropertyValueMap.get(prop);
                                       } else {
                                          values = new ArrayList();
                                          PropertyValueMap.put(prop, values);
                                       }

                                       if (!values.contains(val)) {
                                          values.add(val);
                                       }
                                    }
                                 }

                                 ++n;
                                 continue;
                              }

                              throw new IOException("%s: invalid number of tiles %d, must be from 0 to %d in %s".formatted(filename, nTiles, maxTilesPerTileset, name));
                           }

                           throw new IOException("%s: invalid tileset number %d, must be from 1 to %d in %s".formatted(filename, tilesetNumber, maxTilesetsPerFile, name));
                        }
                        break label144;
                     }

                     throw new IOException("%s: invalid version %d, must be from %d to %d".formatted(filename, version, 1, 1));
                  }

                  throw new IOException("not magic");
               }
            } catch (Throwable var30) {
               try {
                  in.close();
               } catch (Throwable var29) {
                  var30.addSuppressed(var29);
               }

               throw var30;
            }

            in.close();
         } catch (Throwable var31) {
            try {
               fis.close();
            } catch (Throwable var28) {
               var31.addSuppressed(var28);
            }

            throw var31;
         }

         fis.close();
      } catch (Exception var32) {
         Logger.getLogger(GameWindow.class.getName()).log(Level.SEVERE, (String)null, var32);
      }

   }

   private void SetCustomPropertyValues() {
      ((ArrayList)PropertyValueMap.get("WindowN")).add("WindowN");
      ((ArrayList)PropertyValueMap.get("WindowW")).add("WindowW");
      ((ArrayList)PropertyValueMap.get("DoorWallN")).add("DoorWallN");
      ((ArrayList)PropertyValueMap.get("DoorWallW")).add("DoorWallW");
      ((ArrayList)PropertyValueMap.get("WallSE")).add("WallSE");
      ArrayList offsets = new ArrayList();

      int i;
      String value;
      for(i = -96; i <= 96; ++i) {
         value = Integer.toString(i);
         offsets.add(value);
      }

      PropertyValueMap.put("Noffset", offsets);
      PropertyValueMap.put("Soffset", offsets);
      PropertyValueMap.put("Woffset", offsets);
      PropertyValueMap.put("Eoffset", offsets);
      ((ArrayList)PropertyValueMap.get("tree")).add("5");
      ((ArrayList)PropertyValueMap.get("tree")).add("6");
      ((ArrayList)PropertyValueMap.get("tree")).add("7");
      ((ArrayList)PropertyValueMap.get("tree")).add("8");
      ((ArrayList)PropertyValueMap.get(IsoPropertyType.RED_LIGHT.getName())).add("0");
      ((ArrayList)PropertyValueMap.get(IsoPropertyType.GREEN_LIGHT.getName())).add("0");
      ((ArrayList)PropertyValueMap.get(IsoPropertyType.BLUE_LIGHT.getName())).add("0");

      for(i = 0; i <= 96; ++i) {
         value = String.valueOf(i);
         ArrayList values = (ArrayList)PropertyValueMap.get("ItemHeight");
         if (!values.contains(value)) {
            values.add(value);
         }

         values = (ArrayList)PropertyValueMap.get("Surface");
         if (!values.contains(value)) {
            values.add(value);
         }
      }

   }

   private void setOpenDoorProperties(String tilesheetName, ArrayList sprites) {
      for(int i = 0; i < sprites.size(); ++i) {
         IsoSprite spr = (IsoSprite)sprites.get(i);
         if ((spr.getTileType() == IsoObjectType.doorN || spr.getTileType() == IsoObjectType.doorW) && !spr.getProperties().has(IsoFlagType.open)) {
            String doubleDoor = spr.getProperties().get(IsoPropertyType.DOUBLE_DOOR);
            if (doubleDoor != null) {
               int index = PZMath.tryParseInt(doubleDoor, -1);
               if (index >= 5) {
                  spr.getProperties().set(IsoFlagType.open);
               }
            } else {
               String garageDoor = spr.getProperties().get(IsoPropertyType.GARAGE_DOOR);
               if (garageDoor != null) {
                  int index = PZMath.tryParseInt(garageDoor, -1);
                  if (index >= 4) {
                     spr.getProperties().set(IsoFlagType.open);
                  }
               } else {
                  IsoSprite openSprite = (IsoSprite)IsoSpriteManager.instance.namedMap.get(tilesheetName + "_" + (spr.tileSheetIndex + 2));
                  if (openSprite != null) {
                     openSprite.setTileType(spr.getTileType());
                     openSprite.getProperties().set(spr.getTileType() == IsoObjectType.doorN ? IsoFlagType.doorN : IsoFlagType.doorW);
                     openSprite.getProperties().set(IsoFlagType.open);
                  }
               }
            }
         }
      }

   }

   private void saveMovableStats(Map names, int num, int onesprites, int singles, int multies, int totalsprites) throws FileNotFoundException, IOException {
      File path = new File(ZomboidFileSystem.instance.getCacheDir());
      if (path.exists() && path.isDirectory()) {
         String var10002 = ZomboidFileSystem.instance.getCacheDir();
         File f = new File(var10002 + File.separator + "movables_stats_" + num + ".txt");

         try {
            FileWriter w = new FileWriter(f, false);

            try {
               w.write("### Movable objects ###" + System.lineSeparator());
               w.write("Single Face: " + onesprites + System.lineSeparator());
               w.write("Multi Face: " + singles + System.lineSeparator());
               w.write("Multi Face & Multi Sprite: " + multies + System.lineSeparator());
               w.write("Total objects : " + (onesprites + singles + multies) + System.lineSeparator());
               w.write(" " + System.lineSeparator());
               w.write("Total sprites : " + totalsprites + System.lineSeparator());
               w.write(" " + System.lineSeparator());
               Iterator var10 = names.entrySet().iterator();

               while(var10.hasNext()) {
                  Map.Entry entry = (Map.Entry)var10.next();
                  String var10001 = (String)entry.getKey();
                  w.write(var10001 + System.lineSeparator());
                  Iterator var12 = ((ArrayList)entry.getValue()).iterator();

                  while(var12.hasNext()) {
                     String name = (String)var12.next();
                     w.write("\t" + name + System.lineSeparator());
                  }
               }
            } catch (Throwable var15) {
               try {
                  w.close();
               } catch (Throwable var14) {
                  var15.addSuppressed(var14);
               }

               throw var15;
            }

            w.close();
         } catch (Exception var16) {
            ExceptionLogger.logException(var16);
         }
      }

   }

   private void addJumboTreeTileset(IsoSpriteManager sprMan, int fileNumber, String type, String name, int tilesetNumber, int rows, int columns, int windType) {
      for(int row = 0; row < rows; ++row) {
         for(int col = 0; col < columns; ++col) {
            String tilesetName = "e_" + name + type + "_1";
            int tileNum = row * columns + col;
            IsoSprite spr = sprMan.AddSprite(tilesetName + "_" + tileNum, this.getSpriteID(fileNumber, tilesetNumber, tileNum));

            assert GameServer.server || !spr.hasNoTextures();

            spr.setName(tilesetName + "_" + tileNum);
            spr.setTileType(IsoObjectType.tree);
            if (type.contains("JUMBOXXL")) {
               spr.getProperties().set("tree", "8");
            } else if (type.contains("JUMBOXL")) {
               spr.getProperties().set("tree", "7");
            } else if (type.contains("JUMBO") && col == 1) {
               spr.getProperties().set("tree", "6");
            } else if (type.contains("JUMBO") && col == 0) {
               spr.getProperties().set("tree", "5");
            } else {
               spr.getProperties().set("tree", "5");
            }

            spr.getProperties().unset(IsoFlagType.solid);
            spr.getProperties().set(IsoFlagType.blocksight);
            spr.getProperties().set("MaterialType", "Wood_Solid");
            spr.getProperties().CreateKeySet();
            spr.moveWithWind = true;
            spr.windType = windType;
         }
      }

   }

   private void addJumboTrunkTileset(IsoSpriteManager sprMan, int fileNumber, String type, int tilesetNumber) {
      for(int i = 0; i <= 114; ++i) {
         String tilesetName = "e_trunks_" + type + "_" + i;
         IsoSprite spr = sprMan.AddSprite(tilesetName, fileNumber * 512 * 512 + tilesetNumber * 512 + i);

         assert GameServer.server || !spr.hasNoTextures();

         spr.setName(tilesetName);
         spr.setTileType(IsoObjectType.tree);
         if (type.contains("JUMBOXXL")) {
            spr.getProperties().set("tree", "8");
         } else if (type.contains("JUMBOXL")) {
            spr.getProperties().set("tree", "7");
         } else {
            spr.getProperties().set("tree", "5");
         }

         spr.getProperties().unset(IsoFlagType.solid);
         spr.getProperties().set(IsoFlagType.blocksight);
         spr.getProperties().set("MaterialType", "Wood_Solid");
         spr.getProperties().CreateKeySet();
      }

   }

   private void registerFakeJumboTree(IsoSpriteManager sprMan, int fileNumber) {
      int tileNum = false;
      IsoSprite spr = sprMan.AddSprite("jumbo_tree_01_0", fileNumber * 512 * 512 + 6144 + 0);
      spr.setName("jumbo_tree_01_0");
      spr.setTileType(IsoObjectType.tree);
      spr.getProperties().set("tree", "4");
      spr.getProperties().unset(IsoFlagType.solid);
      spr.getProperties().set(IsoFlagType.blocksight);
   }

   private void loadedTileDefinitions() {
      CellLoader.glassRemovedWindowSpriteMap.clear();
      CellLoader.smashedWindowSpriteMap.clear();
      Iterator var1 = IsoSpriteManager.instance.namedMap.values().iterator();

      while(true) {
         while(var1.hasNext()) {
            IsoSprite sprite = (IsoSprite)var1.next();
            PropertyContainer props = sprite.getProperties();
            if (props.has(IsoFlagType.windowW) || props.has(IsoFlagType.windowN)) {
               String val = props.get(IsoPropertyType.GLASS_REMOVED_OFFSET);
               int offset;
               IsoSprite sprite2;
               if (val != null) {
                  offset = PZMath.tryParseInt(val, 0);
                  if (offset != 0) {
                     sprite2 = IsoSprite.getSprite(IsoSpriteManager.instance, sprite, offset);
                     if (sprite2 != null) {
                        CellLoader.glassRemovedWindowSpriteMap.put(sprite2, sprite);
                     }
                  }
               }

               val = props.get(IsoPropertyType.SMASHED_TILE_OFFSET);
               if (val != null) {
                  offset = PZMath.tryParseInt(val, 0);
                  if (offset != 0) {
                     sprite2 = IsoSprite.getSprite(IsoSpriteManager.instance, sprite, offset);
                     if (sprite2 != null) {
                        CellLoader.smashedWindowSpriteMap.put(sprite2, sprite);
                     }
                  }
               }
            }

            if (sprite.name != null && sprite.name.startsWith("fixtures_railings_01")) {
               sprite.getProperties().set(IsoFlagType.NeverCutaway);
            }

            IsoSprite sprite1 = (IsoSprite)IsoSpriteManager.instance.namedMap.get(sprite.tilesetName + "_on_" + sprite.tileSheetIndex);
            if (sprite1 != null && !sprite1.hasNoTextures()) {
               sprite.getProperties().set(IsoFlagType.HasLightOnSprite);
            } else {
               sprite.getProperties().unset(IsoFlagType.HasLightOnSprite);
            }
         }

         SpriteModelManager.getInstance().loadedTileDefinitions();
         TileDepthTextureManager.getInstance().loadedTileDefinitions();
         TileGeometryManager.getInstance().loadedTileDefinitions();
         this.getAttachmentsHandler().loadAttachments();
         return;
      }
   }

   public boolean LoadPlayerForInfo() throws FileNotFoundException, IOException {
      if (GameClient.client) {
         return ClientPlayerDB.getInstance().loadNetworkPlayerInfo(1);
      } else {
         File inFile = ZomboidFileSystem.instance.getFileInCurrentSave("map_p.bin");
         if (!inFile.exists()) {
            PlayerDB.getInstance().importPlayersFromVehiclesDB();
            return PlayerDB.getInstance().loadLocalPlayerInfo(1);
         } else {
            FileInputStream inStream = new FileInputStream(inFile);
            BufferedInputStream input = new BufferedInputStream(inStream);
            synchronized(SliceY.SliceBufferLock) {
               SliceY.SliceBuffer.clear();
               int numBytes = input.read(SliceY.SliceBuffer.array());
               SliceY.SliceBuffer.limit(numBytes);
               input.close();
               byte b1 = SliceY.SliceBuffer.get();
               byte b2 = SliceY.SliceBuffer.get();
               byte b3 = SliceY.SliceBuffer.get();
               byte b4 = SliceY.SliceBuffer.get();
               if (b1 == 80 && b2 == 76 && b3 == 89 && b4 == 82) {
                  int var10 = SliceY.SliceBuffer.getInt();
               } else {
                  SliceY.SliceBuffer.rewind();
               }

               String serverPlayerID = GameWindow.ReadString(SliceY.SliceBuffer);
               if (GameClient.client && !IsoPlayer.isServerPlayerIDValid(serverPlayerID)) {
                  GameLoadingState.gameLoadingString = Translator.getText("IGUI_MP_ServerPlayerIDMismatch", new Object[0]);
                  GameLoadingState.playerWrongIP = true;
                  return false;
               } else {
                  worldX = SliceY.SliceBuffer.getInt();
                  worldY = SliceY.SliceBuffer.getInt();
                  IsoChunkMap.worldXa = SliceY.SliceBuffer.getInt();
                  IsoChunkMap.worldYa = SliceY.SliceBuffer.getInt();
                  IsoChunkMap.worldZa = SliceY.SliceBuffer.getInt();
                  IsoChunkMap.worldXa += 256 * saveoffsetx;
                  IsoChunkMap.worldYa += 256 * saveoffsety;
                  IsoChunkMap.SWorldX[0] = worldX;
                  IsoChunkMap.SWorldY[0] = worldY;
                  int[] var10000 = IsoChunkMap.SWorldX;
                  var10000[0] += 32 * saveoffsetx;
                  var10000 = IsoChunkMap.SWorldY;
                  var10000[0] += 32 * saveoffsety;
                  return true;
               }
            }
         }
      }
   }

   public void init() throws FileNotFoundException, IOException, WorldDictionaryException {
      if (!Core.tutorial) {
         this.randomizedBuildingList.add(new RBSafehouse());
         this.randomizedBuildingList.add(new RBBurnt());
         this.randomizedBuildingList.add(new RBOther());
         this.randomizedBuildingList.add(new RBLooted());
         this.randomizedBuildingList.add(new RBBurntFireman());
         this.randomizedBuildingList.add(new RBBurntCorpse());
         this.randomizedBuildingList.add(new RBShopLooted());
         this.randomizedBuildingList.add(new RBKateAndBaldspot());
         this.randomizedBuildingList.add(new RBStripclub());
         this.randomizedBuildingList.add(new RBSchool());
         this.randomizedBuildingList.add(new RBSpiffo());
         this.randomizedBuildingList.add(new RBPizzaWhirled());
         this.randomizedBuildingList.add(new RBPileOCrepe());
         this.randomizedBuildingList.add(new RBCafe());
         this.randomizedBuildingList.add(new RBBar());
         this.randomizedBuildingList.add(new RBOffice());
         this.randomizedBuildingList.add(new RBHairSalon());
         this.randomizedBuildingList.add(new RBClinic());
         this.randomizedBuildingList.add(new RBGunstoreSiege());
         this.randomizedBuildingList.add(new RBPoliceSiege());
         this.randomizedBuildingList.add(new RBSWATStation());
         this.randomizedBuildingList.add(new RBHeatBreakAfternoon());
         this.randomizedBuildingList.add(new RBTrashed());
         this.randomizedBuildingList.add(new RBBarn());
         this.randomizedBuildingList.add(new RBDorm());
         this.randomizedBuildingList.add(new RBNolans());
         this.randomizedBuildingList.add(new RBJackieJaye());
         this.randomizedBuildingList.add(new RBJoanHartford());
         this.randomizedBuildingList.add(new RBMayorWestPoint());
         this.randomizedBuildingList.add(new RBTwiggy());
         this.randomizedBuildingList.add(new RBWoodcraft());
         this.randomizedVehicleStoryList.add(new RVSUtilityVehicle());
         this.randomizedVehicleStoryList.add(new RVSConstructionSite());
         this.randomizedVehicleStoryList.add(new RVSBurntCar());
         this.randomizedVehicleStoryList.add(new RVSPoliceBlockadeShooting());
         this.randomizedVehicleStoryList.add(new RVSPoliceBlockade());
         this.randomizedVehicleStoryList.add(new RVSCarCrash());
         this.randomizedVehicleStoryList.add(new RVSAmbulanceCrash());
         this.randomizedVehicleStoryList.add(new RVSCarCrashCorpse());
         this.randomizedVehicleStoryList.add(new RVSChangingTire());
         this.randomizedVehicleStoryList.add(new RVSFlippedCrash());
         this.randomizedVehicleStoryList.add(new RVSBanditRoad());
         this.randomizedVehicleStoryList.add(new RVSTrailerCrash());
         this.randomizedVehicleStoryList.add(new RVSCrashHorde());
         this.randomizedVehicleStoryList.add(new RVSCarCrashDeer());
         this.randomizedVehicleStoryList.add(new RVSDeadEnd());
         this.randomizedVehicleStoryList.add(new RVSRegionalProfessionVehicle());
         this.randomizedVehicleStoryList.add(new RVSRoadKill());
         this.randomizedVehicleStoryList.add(new RVSRoadKillSmall());
         this.randomizedVehicleStoryList.add(new RVSAnimalOnRoad());
         this.randomizedVehicleStoryList.add(new RVSHerdOnRoad());
         this.randomizedVehicleStoryList.add(new RVSAnimalTrailerOnRoad());
         this.randomizedVehicleStoryList.add(new RVSRichJerk());
         this.randomizedVehicleStoryList.add(new RVSPlonkies());
         this.randomizedZoneList.add(new RZSAttachedAnimal());
         this.randomizedZoneList.add(new RZSBBQParty());
         this.randomizedZoneList.add(new RZSBaseball());
         this.randomizedZoneList.add(new RZSBeachParty());
         this.randomizedZoneList.add(new RZSBurntWreck());
         this.randomizedZoneList.add(new RZSBuryingCamp());
         this.randomizedZoneList.add(new RZSCampsite());
         this.randomizedZoneList.add(new RZSCharcoalBurner());
         this.randomizedZoneList.add(new RZSDean());
         this.randomizedZoneList.add(new RZSDuke());
         this.randomizedZoneList.add(new RZSEscapedAnimal());
         this.randomizedZoneList.add(new RZSEscapedHerd());
         this.randomizedZoneList.add(new RZSFishingTrip());
         this.randomizedZoneList.add(new RZSForestCamp());
         this.randomizedZoneList.add(new RZSForestCampEaten());
         this.randomizedZoneList.add(new RZSFrankHemingway());
         this.randomizedZoneList.add(new RZSHermitCamp());
         this.randomizedZoneList.add(new RZSHillbillyHoedown());
         this.randomizedZoneList.add(new RZSHogWild());
         this.randomizedZoneList.add(new RZSHunterCamp());
         this.randomizedZoneList.add(new RZJackieJaye());
         this.randomizedZoneList.add(new RZSKirstyKormick());
         this.randomizedZoneList.add(new RZSMurderScene());
         this.randomizedZoneList.add(new RZSMusicFest());
         this.randomizedZoneList.add(new RZSMusicFestStage());
         this.randomizedZoneList.add(new RZSNastyMattress());
         this.randomizedZoneList.add(new RZSOccultActivity());
         this.randomizedZoneList.add(new RZSOldFirepit());
         this.randomizedZoneList.add(new RZSOldShelter());
         this.randomizedZoneList.add(new RZSOrphanedFawn());
         this.randomizedZoneList.add(new RZSRangerSmith());
         this.randomizedZoneList.add(new RZSRockerParty());
         this.randomizedZoneList.add(new RZSSadCamp());
         this.randomizedZoneList.add(new RZSSexyTime());
         this.randomizedZoneList.add(new RZSSirTwiggy());
         this.randomizedZoneList.add(new RZSSurvivalistCamp());
         this.randomizedZoneList.add(new RZSTragicPicnic());
         this.randomizedZoneList.add(new RZSTrapperCamp());
         this.randomizedZoneList.add(new RZSVanCamp());
         this.randomizedZoneList.add(new RZSWasteDump());
         this.randomizedZoneList.add(new RZSWaterPump());
      }

      RBBasic.getUniqueRDSSpawned().clear();
      if (!GameClient.client && !GameServer.server) {
         BodyDamageSync.instance = null;
      } else {
         BodyDamageSync.instance = new BodyDamageSync();
      }

      if (GameServer.server) {
         Core.gameSaveWorld = GameServer.serverName;
         String saveFolder = ZomboidFileSystem.instance.getCurrentSaveDir();
         File file = new File(saveFolder);
         if (!file.exists()) {
            GameServer.resetId = Rand.Next(10000000);
            ServerOptions.instance.putSaveOption("ResetID", String.valueOf(GameServer.resetId));
         }

         GlobalObject.createWorld(Core.gameSaveWorld);
      }

      savedWorldVersion = this.readWorldVersion();
      DataInputStream input;
      int x;
      File inFile;
      FileInputStream fis;
      if (!GameServer.server) {
         inFile = ZomboidFileSystem.instance.getFileInCurrentSave("map_ver.bin");

         try {
            fis = new FileInputStream(inFile);

            try {
               input = new DataInputStream(fis);

               try {
                  x = input.readInt();
                  String mapDir = GameWindow.ReadString(input);
                  if (!GameClient.client) {
                     Core.gameMap = mapDir;
                  }
               } catch (Throwable var36) {
                  try {
                     input.close();
                  } catch (Throwable var32) {
                     var36.addSuppressed(var32);
                  }

                  throw var36;
               }

               input.close();
            } catch (Throwable var37) {
               try {
                  fis.close();
               } catch (Throwable var31) {
                  var37.addSuppressed(var31);
               }

               throw var37;
            }

            fis.close();
         } catch (FileNotFoundException var38) {
         }
      }

      if (!GameClient.client) {
         inFile = ZomboidFileSystem.instance.getFileInCurrentSave("id_manager_data.bin");

         try {
            fis = new FileInputStream(inFile);

            try {
               input = new DataInputStream(fis);

               try {
                  x = input.readInt();
                  ObjectIDManager.getInstance().load(input, x);
               } catch (Throwable var28) {
                  try {
                     input.close();
                  } catch (Throwable var27) {
                     var28.addSuppressed(var27);
                  }

                  throw var28;
               }

               input.close();
            } catch (Throwable var29) {
               try {
                  fis.close();
               } catch (Throwable var26) {
                  var29.addSuppressed(var26);
               }

               throw var29;
            }

            fis.close();
         } catch (FileNotFoundException var30) {
         }
      }

      int z;
      int y;
      if (!GameClient.client) {
         inFile = ZomboidFileSystem.instance.getFileInCurrentSave("important_area_data.bin");

         try {
            fis = new FileInputStream(inFile);

            try {
               BufferedInputStream input = new BufferedInputStream(fis);

               try {
                  synchronized(SliceY.SliceBufferLock) {
                     SliceY.SliceBuffer.clear();
                     y = input.read(SliceY.SliceBuffer.array());
                     SliceY.SliceBuffer.limit(y);
                     input.close();
                     z = SliceY.SliceBuffer.getInt();
                     ImportantAreaManager.getInstance().load(SliceY.SliceBuffer, z);
                  }
               } catch (Throwable var23) {
                  try {
                     input.close();
                  } catch (Throwable var21) {
                     var23.addSuppressed(var21);
                  }

                  throw var23;
               }

               input.close();
            } catch (Throwable var24) {
               try {
                  fis.close();
               } catch (Throwable var20) {
                  var24.addSuppressed(var20);
               }

               throw var24;
            }

            fis.close();
         } catch (FileNotFoundException var25) {
         }
      }

      WorldGenParams.Result wgLoadResult = WorldGenParams.INSTANCE.load();
      if (wgLoadResult == Result.CLIENT || wgLoadResult == Result.NOT_PRESENT && GameServer.server) {
         String newSeed = ServerOptions.instance.seed.getValue();
         if (GameServer.server && newSeed.isEmpty()) {
            newSeed = GameServer.seed;
            ServerOptions.instance.changeOption("Seed", newSeed);
         }

         WorldGenParams.INSTANCE.setSeedString(newSeed);
         WorldGenParams.INSTANCE.setMinXCell(-250);
         WorldGenParams.INSTANCE.setMaxXCell(250);
         WorldGenParams.INSTANCE.setMinYCell(-250);
         WorldGenParams.INSTANCE.setMaxYCell(250);
      }

      if (!GameServer.server || !GameServer.softReset) {
         this.metaGrid.CreateStep1();
      }

      LuaEventManager.triggerEvent("OnPreDistributionMerge");
      LuaEventManager.triggerEvent("OnDistributionMerge");
      LuaEventManager.triggerEvent("OnPostDistributionMerge");
      DebugType.General.println("VehiclesDB2.init() start");
      VehiclesDB2.instance.init();
      DebugType.General.println("VehiclesDB2.init() end");
      DebugType.General.println("triggerEvent OnInitWorld");
      LuaEventManager.triggerEvent("OnInitWorld");
      if (!GameClient.client) {
         DebugType.General.println("SandboxOptions.load() start");
         SandboxOptions.instance.load();
         DebugType.General.println("SandboxOptions.load() end");
      }

      DebugType.General.println("ItemPickerJava.Parse() start");
      ItemPickerJava.Parse();
      DebugType.General.println("ItemPickerJava.Parse() end");
      this.hydroPowerOn = SandboxOptions.getInstance().doesPowerGridExist();
      ZomboidGlobals.toLua();
      ItemPickerJava.InitSandboxLootSettings();
      this.survivorDescriptors.clear();
      IsoSpriteManager.instance.Dispose();
      if (GameClient.client && ServerOptions.instance.doLuaChecksum.getValue()) {
         DebugType.General.println("client: DoLuaChecksum start");

         try {
            NetChecksum.comparer.beginCompare();
            GameLoadingState.gameLoadingString = Translator.getText("IGUI_MP_Checksum", new Object[0]);
            long start = System.currentTimeMillis();
            long prevSecond = start;

            while(!GameClient.checksumValid) {
               if (GameWindow.serverDisconnected) {
                  return;
               }

               if (System.currentTimeMillis() > start + LUA_CHECKSUM_TIMEOUT_MS) {
                  DebugType.General.println("checksum: timed out waiting for the server to respond");
                  GameClient.connection.forceDisconnect("world-timeout-response");
                  GameWindow.serverDisconnected = true;
                  GameWindow.kickReason = Translator.getText("UI_GameLoad_TimedOut", new Object[0]);
                  return;
               }

               if (System.currentTimeMillis() > prevSecond + 1000L) {
                  DebugType.Moveable.println("checksum: waited one second");
                  prevSecond += 1000L;
               }

               NetChecksum.comparer.update();
               if (GameClient.checksumValid) {
                  break;
               }

               Thread.sleep(100L);
            }
         } catch (Exception var35) {
            ExceptionLogger.logException(var35);
         }

         DebugType.General.println("client: DoLuaChecksum end");
      }

      GameLoadingState.gameLoadingString = Translator.getText("IGUI_MP_LoadTileDef", new Object[0]);
      IsoSpriteManager spriteManager = IsoSpriteManager.instance;
      this.tileImages.clear();
      DebugType.General.println("LoadTileDefinitions start");
      ZomboidFileSystem zfs = ZomboidFileSystem.instance;
      this.LoadTileDefinitionsPropertyStrings(spriteManager, zfs.getMediaPath("newtiledefinitions.tiles"), 1);
      this.LoadTileDefinitionsPropertyStrings(spriteManager, zfs.getMediaPath("tiledefinitions_erosion.tiles"), 2);
      this.LoadTileDefinitionsPropertyStrings(spriteManager, zfs.getMediaPath("tiledefinitions_overlays.tiles"), 4);
      this.LoadTileDefinitionsPropertyStrings(spriteManager, zfs.getMediaPath("tiledefinitions_b42chunkcaching.tiles"), 5);
      this.LoadTileDefinitionsPropertyStrings(spriteManager, zfs.getMediaPath("tiledefinitions_noiseworks.patch.tiles"), -1);
      this.LoadTileDefinitionsPropertyStrings(spriteManager, zfs.getMediaPath("jumbo_trees_big.tiles"), 6);
      this.LoadTileDefinitionsPropertyStrings(spriteManager, zfs.getMediaPath("jumbo_trees.tiles"), 8);
      ZomboidFileSystem.instance.loadModTileDefPropertyStrings();
      this.SetCustomPropertyValues();
      this.GenerateTilePropertyLookupTables();
      this.LoadTileDefinitions(spriteManager, zfs.getMediaPath("newtiledefinitions.tiles"), 1);
      this.LoadTileDefinitions(spriteManager, zfs.getMediaPath("tiledefinitions_erosion.tiles"), 2);
      this.LoadTileDefinitions(spriteManager, zfs.getMediaPath("tiledefinitions_overlays.tiles"), 4);
      this.LoadTileDefinitions(spriteManager, zfs.getMediaPath("tiledefinitions_b42chunkcaching.tiles"), 5);
      this.LoadTileDefinitions(spriteManager, zfs.getMediaPath("tiledefinitions_noiseworks.patch.tiles"), -1);
      this.LoadTileDefinitions(spriteManager, zfs.getMediaPath("jumbo_trees_big.tiles"), 6);
      this.LoadTileDefinitions(spriteManager, zfs.getMediaPath("jumbo_trees.tiles"), 8);
      this.registerFakeJumboTree(spriteManager, 7);
      ZomboidFileSystem.instance.loadModTileDefs();
      GameLoadingState.gameLoadingString = "";
      DebugType.General.println("LoadTileDefinitions end");
      spriteManager.AddSprite("media/ui/missing-tile.png");
      ScriptManager.instance.PostTileDefinitions();
      DebugType.General.println("triggerEvent OnLoadedTileDefinitions");
      LuaEventManager.triggerEvent("OnLoadedTileDefinitions", spriteManager);
      this.loadedTileDefinitions();
      AnimalDefinitions.getAnimalDefs();
      if (GameServer.server && GameServer.softReset) {
         IsoRegions.init();
         BentFences.init();
         WorldConverter.instance.softreset();
      }

      try {
         WeatherFxMask.init();
      } catch (Exception var19) {
         ExceptionLogger.logException(var19);
      }

      TemplateText.Initialize();
      IsoRegions.init();
      BentFences.init();
      ObjectRenderEffects.init();
      WorldConverter.instance.convert(Core.gameSaveWorld, spriteManager);
      if (!GameLoadingState.worldVersionError) {
         SandboxOptions.instance.handleOldZombiesFile2();
         DebugType.General.println("GameTime.init() and load() start");
         GameTime.getInstance().init();
         GameTime.getInstance().load();
         DebugType.General.println("GameTime.init() and load() end");
         ImprovedFog.init();
         DebugType.General.println("ZomboidRadio.Init() start");
         ZomboidRadio.getInstance().Init(savedWorldVersion);
         DebugType.General.println("ZomboidRadio.Init() end");
         DebugType.General.println("GlobalModData.init() start");
         GlobalModData.instance.init();
         DebugType.General.println("GlobalModData.init() end");
         DebugType.General.println("InstanceTracker.load() start");
         InstanceTracker.load();
         DebugType.General.println("InstanceTracker.load() end");
         if (GameServer.server && Core.getInstance().getPoisonousBerry() == null) {
            Core.getInstance().initPoisonousBerry();
         }

         if (GameServer.server && Core.getInstance().getPoisonousMushroom() == null) {
            Core.getInstance().initPoisonousMushroom();
         }

         DebugType.General.println("ErosionGlobals.Boot() start");
         ErosionGlobals.Boot(spriteManager);
         DebugType.General.println("ErosionGlobals.Boot() end");
         DebugType.General.println("WorldDictionary.init() start");
         WorldDictionary.init();
         ScriptManager.instance.PostWorldDictionaryInit();
         DebugType.General.println("WorldDictionary.init() end");
         FishSchoolManager.getInstance().init();
         WorldMarkers.instance.init();
         DebugType.General.println("GameEntityManager.Init() start");
         GameEntityManager.Init(savedWorldVersion);
         DebugType.General.println("GameEntityManager.Init() end");
         if (GameServer.server) {
            SharedDescriptors.initSharedDescriptors();
         }

         DebugType.General.println("PersistentOutfits.init() start");
         PersistentOutfits.instance.init();
         DebugType.General.println("PersistentOutfits.init() end");
         VehicleIDMap.instance.Reset();
         VehicleManager.instance = new VehicleManager();
         GameLoadingState.gameLoadingString = Translator.getText("IGUI_MP_InitMap", new Object[0]);
         this.metaGrid.CreateStep2();
         ClimateManager.getInstance().init(this.metaGrid);
         SafeHouse.init();
         VirtualZombieManager.instance.init();
         if (!GameClient.client) {
            StashSystem.init();
         }

         Basements.getInstance().beforeOnLoadMapZones();
         LuaEventManager.triggerEvent("OnLoadMapZones");
         if (!GameClient.client) {
            Basements.getInstance().beforeLoadMetaGrid();
            BuildingRoomsEditor.getInstance().load();
            this.metaGrid.load();
            Basements.getInstance().afterLoadMetaGrid();
            IsoMetaGrid var10000 = this.metaGrid;
            IsoMetaGrid var10002 = this.metaGrid;
            Objects.requireNonNull(var10002);
            var10000.load("map_zone.bin", var10002::loadZone);
            this.metaGrid.loadCells("metagrid", "metacell_(-?[0-9]+)_(-?[0-9]+)\\.bin", IsoMetaCell::load);
            var10000 = this.metaGrid;
            var10002 = this.metaGrid;
            Objects.requireNonNull(var10002);
            var10000.load("map_animals.bin", var10002::loadAnimalZones);
            this.metaGrid.processZones();
         } else {
            Basements.getInstance().beforeLoadMetaGrid();
         }

         DebugType.General.println("triggerEvent OnLoadedMapZones");
         LuaEventManager.triggerEvent("OnLoadedMapZones");
         if (GameServer.server) {
            ServerMap.instance.init(this.metaGrid);
         }

         DebugType.General.println("ItemConfigurator.Preprocess() start");
         ItemConfigurator.Preprocess();
         DebugType.General.println("ItemConfigurator.Preprocess() end");
         boolean isPlayerAlive = false;
         if (GameClient.client) {
            if (ClientPlayerDB.getInstance().clientLoadNetworkPlayer() && ClientPlayerDB.getInstance().isAliveMainNetworkPlayer()) {
               isPlayerAlive = true;
            }
         } else {
            isPlayerAlive = PlayerDBHelper.isPlayerAlive(ZomboidFileSystem.instance.getCurrentSaveDir(), 1);
         }

         if (GameServer.server) {
            ServerPlayerDB.setAllow(true);
         }

         if (!GameClient.client && !GameServer.server) {
            PlayerDB.setAllow(true);
         }

         boolean bLoadCharacter;
         if (isPlayerAlive) {
            bLoadCharacter = true;
            if (!this.LoadPlayerForInfo()) {
               return;
            }

            worldX = IsoChunkMap.SWorldX[IsoPlayer.getPlayerIndex()];
            worldY = IsoChunkMap.SWorldY[IsoPlayer.getPlayerIndex()];
         } else {
            bLoadCharacter = false;
            if (GameClient.client && !ServerOptions.instance.spawnPoint.getValue().isEmpty()) {
               String[] spawnPoint = ServerOptions.instance.spawnPoint.getValue().split(",");
               if (spawnPoint.length == 3) {
                  try {
                     IsoChunkMap.mpWorldXa = Integer.parseInt(spawnPoint[0].trim());
                     IsoChunkMap.mpWorldYa = Integer.parseInt(spawnPoint[1].trim());
                     IsoChunkMap.mpWorldZa = Integer.parseInt(spawnPoint[2].trim());
                  } catch (NumberFormatException var18) {
                     DebugType.Moveable.println("ERROR: SpawnPoint must be x,y,z, got \"" + ServerOptions.instance.spawnPoint.getValue() + "\"");
                     IsoChunkMap.mpWorldXa = 0;
                     IsoChunkMap.mpWorldYa = 0;
                     IsoChunkMap.mpWorldZa = 0;
                  }
               } else {
                  DebugType.Moveable.println("ERROR: SpawnPoint must be x,y,z, got \"" + ServerOptions.instance.spawnPoint.getValue() + "\"");
               }
            }

            if (!GameClient.client || IsoChunkMap.mpWorldXa == 0 && IsoChunkMap.mpWorldYa == 0) {
               IsoChunkMap.worldXa = this.getLuaPosX();
               IsoChunkMap.worldYa = this.getLuaPosY();
               IsoChunkMap.worldZa = this.getLuaPosZ();
               if (GameClient.client && ServerOptions.instance.safehouseAllowRespawn.getValue()) {
                  for(z = 0; z < SafeHouse.getSafehouseList().size(); ++z) {
                     SafeHouse safe = (SafeHouse)SafeHouse.getSafehouseList().get(z);
                     if (safe.getPlayers().contains(GameClient.username) && safe.isRespawnInSafehouse(GameClient.username)) {
                        IsoChunkMap.worldXa = safe.getX() + safe.getH() / 2;
                        IsoChunkMap.worldYa = safe.getY() + safe.getW() / 2;
                        IsoChunkMap.worldZa = 0;
                     }
                  }
               }

               worldX = PZMath.fastfloor((float)IsoChunkMap.worldXa / 8.0F);
               worldY = PZMath.fastfloor((float)IsoChunkMap.worldYa / 8.0F);
            } else {
               IsoChunkMap.worldXa = IsoChunkMap.mpWorldXa;
               IsoChunkMap.worldYa = IsoChunkMap.mpWorldYa;
               IsoChunkMap.worldZa = IsoChunkMap.mpWorldZa;
               worldX = PZMath.fastfloor((float)IsoChunkMap.worldXa / 8.0F);
               worldY = PZMath.fastfloor((float)IsoChunkMap.worldYa / 8.0F);
            }
         }

         KahluaTable selectedDebugScenario = (KahluaTable)LuaManager.env.rawget("selectedDebugScenario");
         int xa;
         int ya;
         int za;
         if (selectedDebugScenario != null) {
            KahluaTable loc = (KahluaTable)selectedDebugScenario.rawget("startLoc");
            xa = ((Double)loc.rawget("x")).intValue();
            ya = ((Double)loc.rawget("y")).intValue();
            za = ((Double)loc.rawget("z")).intValue();
            IsoChunkMap.worldXa = xa;
            IsoChunkMap.worldYa = ya;
            IsoChunkMap.worldZa = za;
            worldX = PZMath.fastfloor((float)IsoChunkMap.worldXa / 8.0F);
            worldY = PZMath.fastfloor((float)IsoChunkMap.worldYa / 8.0F);
         }

         DebugType.General.println("MapCollisionData.init() start");
         MapCollisionData.instance.init(instance.getMetaGrid());
         DebugType.General.println("MapCollisionData.init() end");
         DebugType.General.println("AnimalPopulationManager.init() start");
         AnimalPopulationManager.getInstance().init(this.getMetaGrid());
         DebugType.General.println("AnimalPopulationManager.init() end");
         DebugType.General.println("ZombiePopulationManager.init() start");
         ZombiePopulationManager.instance.init(instance.getMetaGrid());
         DebugType.General.println("ZombiePopulationManager.init() end");
         DebugType.General.println("Pathfind init() start");
         PathfindNative.useNativeCode = DebugOptions.instance.pathfindUseNativeCode.getValue();
         if (PathfindNative.useNativeCode) {
            PathfindNative.instance.init(instance.getMetaGrid());
         } else {
            PolygonalMap2.instance.init(instance.getMetaGrid());
         }

         DebugType.General.println("Pathfind init() end");
         GlobalObjectLookup.init(instance.getMetaGrid());
         if (!GameServer.server) {
            SpawnPoints.instance.initSinglePlayer(this.metaGrid);
         }

         DebugType.General.println("WorldStreamer.create() start");
         WorldStreamer.instance.create();
         DebugType.General.println("WorldStreamer.create() end");
         DebugType.General.println("CellLoader.LoadCellBinaryChunk start");
         this.currentCell = CellLoader.LoadCellBinaryChunk(spriteManager, worldX, worldY);
         DebugType.General.println("CellLoader.LoadCellBinaryChunk start");
         ClimateManager.getInstance().postCellLoadSetSnow();
         GameLoadingState.gameLoadingString = Translator.getText("IGUI_MP_LoadWorld", new Object[0]);
         MapCollisionData.instance.start();
         if (!GameServer.server) {
            DebugType.General.println("MapItem.LoadWorldMap() start");
            MapItem.LoadWorldMap();
            DebugType.General.println("MapItem.LoadWorldMap() start");
         }

         if (GameClient.client) {
            WorldMapClient.instance.worldMapLoaded();
         }

         if (GameServer.server) {
            HiddenAuthors.read();
         }

         DebugType.General.println("WorldStreamer.isBusy() loop start");

         while(WorldStreamer.instance.isBusy()) {
            try {
               Thread.sleep(100L);
            } catch (InterruptedException var17) {
            }
         }

         DebugType.General.println("WorldStreamer.isBusy() loop end");
         ArrayList loaded = new ArrayList(IsoChunk.loadGridSquare);
         Iterator var55 = loaded.iterator();

         while(var55.hasNext()) {
            IsoChunk chunk = (IsoChunk)var55.next();
            this.currentCell.chunkMap[0].setChunkDirect(chunk, false);
         }

         this.currentCell.chunkMap[0].calculateZExtentsForChunkMap();
         IsoChunk.doServerRequests = true;
         IsoGridSquare sq;
         if (bLoadCharacter && SystemDisabler.doPlayerCreation) {
            this.currentCell.LoadPlayer(savedWorldVersion);
            if (GameClient.client) {
               IsoPlayer.getInstance().setUsername(GameClient.username);
            }

            ZomboidRadio.getInstance().getRecordedMedia().handleLegacyListenedLines(IsoPlayer.getInstance());
         } else {
            IsoGridSquare sq;
            if (GameClient.client) {
               ZomboidRadio.getInstance().getRecordedMedia().handleLegacyListenedLines((IsoPlayer)null);
               LuaManager.thread.debugOwnerThread = GameWindow.gameThread;
               LuaManager.debugthread.debugOwnerThread = GameWindow.gameThread;
               GameClient.sendCreatePlayer((byte)0);
               DebugType.General.println("Waiting for the server to send player data");
               long currentTime = System.currentTimeMillis();
               boolean playerLoaded = false;

               label482:
               while(true) {
                  while(true) {
                     try {
                        if (IsoPlayer.players[0] != null) {
                           playerLoaded = true;
                        }

                        if (System.currentTimeMillis() - currentTime > 30000L || playerLoaded) {
                           break label482;
                        }

                        Thread.sleep(100L);
                     } catch (InterruptedException var33) {
                     }
                  }
               }

               LuaManager.thread.debugOwnerThread = GameLoadingState.loader;
               LuaManager.debugthread.debugOwnerThread = GameLoadingState.loader;
               if (!playerLoaded) {
                  throw new RuntimeException("Timed out waiting for the server to send player data");
               }

               DebugType.General.println("Player data received from the server");
               IsoPlayer playerObj = IsoPlayer.players[0];
               IsoChunkMap.worldXa = playerObj.getXi();
               IsoChunkMap.worldYa = playerObj.getYi();
               IsoChunkMap.worldZa = playerObj.getZi();
               sq = this.currentCell.getGridSquare(IsoChunkMap.worldXa, IsoChunkMap.worldYa, IsoChunkMap.worldZa);
               if (sq != null && sq.getRoom() != null) {
                  if (SandboxOptions.instance.lore.playerSpawnZombieRemoval.getValue() < 4) {
                     sq.getRoom().def.setExplored(true);
                  } else if (SandboxOptions.instance.lore.playerSpawnZombieRemoval.getValue() < 3) {
                     sq.getRoom().building.setAllExplored(true, sq.getRoom());
                     this.setBasementAllExplored(sq.getRoom().building);
                  }

                  if (!GameServer.server && !GameClient.client) {
                     ZombiePopulationManager.instance.playerSpawnedAt(sq.getX(), sq.getY(), sq.getZ());
                  }
               }

               if (!GameClient.client) {
                  Core.getInstance().initPoisonousBerry();
                  Core.getInstance().initPoisonousMushroom();
               }

               LuaEventManager.triggerEvent("OnNewGame", playerObj, sq);
            } else {
               ZomboidRadio.getInstance().getRecordedMedia().handleLegacyListenedLines((IsoPlayer)null);
               if (IsoPlayer.numPlayers == 0) {
                  IsoPlayer.numPlayers = 1;
               }

               xa = IsoChunkMap.worldXa;
               ya = IsoChunkMap.worldYa;
               za = IsoChunkMap.worldZa;
               if (GameClient.client && !ServerOptions.instance.spawnPoint.getValue().isEmpty()) {
                  String[] spawnPoint = ServerOptions.instance.spawnPoint.getValue().split(",");
                  if (spawnPoint.length != 3) {
                     DebugType.Moveable.println("ERROR: SpawnPoint must be x,y,z, got \"" + ServerOptions.instance.spawnPoint.getValue() + "\"");
                  } else {
                     try {
                        int yAb = Integer.parseInt(spawnPoint[1].trim());
                        int xAb = Integer.parseInt(spawnPoint[0].trim());
                        int zAb = Integer.parseInt(spawnPoint[2].trim());
                        if (GameClient.client && ServerOptions.instance.safehouseAllowRespawn.getValue()) {
                           for(int i = 0; i < SafeHouse.getSafehouseList().size(); ++i) {
                              SafeHouse safe = (SafeHouse)SafeHouse.getSafehouseList().get(i);
                              if (safe.getPlayers().contains(GameClient.username) && safe.isRespawnInSafehouse(GameClient.username)) {
                                 xAb = safe.getX() + safe.getH() / 2;
                                 yAb = safe.getY() + safe.getW() / 2;
                                 zAb = 0;
                              }
                           }
                        }

                        if (this.currentCell.getGridSquare(xAb, yAb, zAb) != null) {
                           xa = xAb;
                           ya = yAb;
                           za = zAb;
                        }
                     } catch (NumberFormatException var34) {
                        DebugType.Moveable.println("ERROR: SpawnPoint must be x,y,z, got \"" + ServerOptions.instance.spawnPoint.getValue() + "\"");
                     }
                  }
               }

               sq = this.currentCell.getGridSquare(xa, ya, za);
               if (SystemDisabler.doPlayerCreation && !GameServer.server) {
                  if (sq != null && sq.isFree(false) && sq.getRoom() != null) {
                     sq = sq;
                     sq = sq.getRoom().getFreeTile();
                     if (sq == null) {
                        sq = sq;
                     }
                  }

                  IsoPlayer player = null;
                  if (this.getLuaPlayerDesc() != null) {
                     if (GameClient.client && ServerOptions.instance.safehouseAllowRespawn.getValue()) {
                        sq = this.currentCell.getGridSquare(IsoChunkMap.worldXa, IsoChunkMap.worldYa, IsoChunkMap.worldZa);
                        if (sq != null && sq.isFree(false) && sq.getRoom() != null) {
                           IsoGridSquare last = sq;
                           sq = sq.getRoom().getFreeTile();
                           if (sq == null) {
                              sq = last;
                           }
                        }
                     }

                     if (sq == null) {
                        throw new RuntimeException("can't create player at x,y,z=" + xa + "," + ya + "," + za + " because the square is null");
                     }

                     WorldSimulation.instance.create();
                     player = new IsoPlayer(instance.currentCell, this.getLuaPlayerDesc(), sq.getX(), sq.getY(), sq.getZ());
                     if (GameClient.client) {
                        player.setUsername(GameClient.username);
                     }

                     player.setDir(IsoDirections.SE);
                     player.sqlId = 1;
                     IsoPlayer.players[0] = player;
                     IsoPlayer.setInstance(player);
                     IsoCamera.setCameraCharacter(player);
                  }

                  IsoPlayer playerObj = IsoPlayer.getInstance();
                  playerObj.applyTraits(this.getLuaTraits());
                  CharacterProfessionDefinition characterProfessionDefinition = CharacterProfessionDefinition.getCharacterProfessionDefinition(playerObj.getDescriptor().getCharacterProfession());
                  if (characterProfessionDefinition.hasGrantedRecipes()) {
                     playerObj.getKnownRecipes().addAll(characterProfessionDefinition.getGrantedRecipes());
                  }

                  Iterator var66 = this.getLuaTraits().iterator();

                  while(var66.hasNext()) {
                     CharacterTrait characterTrait = (CharacterTrait)var66.next();
                     CharacterTraitDefinition characterTraitDefinition = CharacterTraitDefinition.getCharacterTraitDefinition(characterTrait);
                     if (characterTraitDefinition.hasGrantedRecipes()) {
                        playerObj.getKnownRecipes().addAll(characterTraitDefinition.getGrantedRecipes());
                     }
                  }

                  if (sq != null && sq.getRoom() != null) {
                     sq.getRoom().def.setExplored(true);
                     sq.getRoom().building.setAllExplored(true);
                     this.setBasementAllExplored(sq.getRoom().getBuilding());
                     if (!GameServer.server && !GameClient.client) {
                        ZombiePopulationManager.instance.playerSpawnedAt(sq.getX(), sq.getY(), sq.getZ());
                     }
                  }

                  if (!GameClient.client) {
                     Core.getInstance().initPoisonousBerry();
                     Core.getInstance().initPoisonousMushroom();
                  }

                  LuaEventManager.triggerEvent("OnNewGame", player, sq);
               }
            }
         }

         if (PlayerDB.isAllow()) {
            PlayerDB.getInstance().canSavePlayers = true;
         }

         TutorialManager.instance.activeControlZombies = false;
         ReanimatedPlayers.instance.loadReanimatedPlayers();
         if (IsoPlayer.getInstance() != null) {
            if (GameClient.client) {
               x = PZMath.fastfloor(IsoPlayer.getInstance().getX());
               y = PZMath.fastfloor(IsoPlayer.getInstance().getY());
               z = PZMath.fastfloor(IsoPlayer.getInstance().getZ());

               while(z > 0) {
                  sq = this.currentCell.getGridSquare(x, y, PZMath.fastfloor((float)z));
                  if (sq != null && sq.TreatAsSolidFloor()) {
                     break;
                  }

                  --z;
                  IsoPlayer.getInstance().setZ((float)z);
               }
            }

            ScriptManager.instance.checkAutoLearn(IsoPlayer.getInstance());
            ScriptManager.instance.checkMetaRecipes(IsoPlayer.getInstance());
            ScriptManager.instance.VerifyAllCraftRecipesAreLearnable();
            IsoPlayer.getInstance().setCurrentSquareFromPosition();
         }

         this.PopulateCellWithSurvivors();
         if (IsoPlayer.players[0] != null && !this.currentCell.getObjectList().contains(IsoPlayer.players[0])) {
            this.currentCell.getObjectList().add(IsoPlayer.players[0]);
         }

         LightingThread.instance.create();
         DebugType.General.println("MetaTracker.load() start");
         MetaTracker.load();
         DebugType.General.println("MetaTracker.load() end");
         StatisticsManager.getInstance().load();
         GameLoadingState.gameLoadingString = "";
         AnimationPlayerRecorder.initMessaging();
         WorldDictionary.onWorldLoaded();
         this.currentCell.initWeatherFx();
         if (ScriptManager.instance.hasLoadErrors(!Core.debug) || SpriteConfigManager.HasLoadErrors()) {
            DebugType var69 = DebugType.Moveable;
            boolean var10001 = ScriptManager.instance.hasLoadErrors(!Core.debug);
            var69.println("script error = " + var10001 + ", sprite error = " + SpriteConfigManager.HasLoadErrors());
            throw new WorldDictionaryException("World loading could not proceed, there are script load errors. (Actual error may be printed earlier in log)");
         }
      }
   }

   private void setBasementAllExplored(IsoBuilding spawnBuilding) {
      BuildingDef spawnBuildingDef = spawnBuilding.getDef();
      ArrayList buildingDefs = new ArrayList();
      instance.metaGrid.getBuildingsIntersecting(spawnBuildingDef.getX(), spawnBuildingDef.getY(), spawnBuildingDef.getW(), spawnBuildingDef.getH(), buildingDefs);

      for(int i = 0; i < buildingDefs.size(); ++i) {
         BuildingDef candidateDef = (BuildingDef)buildingDefs.get(i);
         if (candidateDef.getMinLevel() < 0) {
            candidateDef.setAllExplored(true);
         }
      }

   }

   int readWorldVersion() {
      File file;
      FileInputStream fis;
      DataInputStream dis;
      if (GameServer.server) {
         file = ZomboidFileSystem.instance.getFileInCurrentSave("map_t.bin");

         try {
            fis = new FileInputStream(file);

            label107: {
               int var8;
               try {
                  label118: {
                     dis = new DataInputStream(fis);

                     try {
                        byte b1 = dis.readByte();
                        byte b2 = dis.readByte();
                        byte b3 = dis.readByte();
                        byte b4 = dis.readByte();
                        if (b1 == 71 && b2 == 77 && b3 == 84 && b4 == 77) {
                           var8 = dis.readInt();
                           break label118;
                        }
                     } catch (Throwable var17) {
                        try {
                           dis.close();
                        } catch (Throwable var12) {
                           var17.addSuppressed(var12);
                        }

                        throw var17;
                     }

                     dis.close();
                     break label107;
                  }

                  dis.close();
               } catch (Throwable var18) {
                  try {
                     fis.close();
                  } catch (Throwable var11) {
                     var18.addSuppressed(var11);
                  }

                  throw var18;
               }

               fis.close();
               return var8;
            }

            fis.close();
         } catch (FileNotFoundException var19) {
         } catch (IOException var20) {
            ExceptionLogger.logException(var20);
         }

         return -1;
      } else {
         file = ZomboidFileSystem.instance.getFileInCurrentSave("map_ver.bin");

         try {
            fis = new FileInputStream(file);

            int var4;
            try {
               dis = new DataInputStream(fis);

               try {
                  var4 = dis.readInt();
               } catch (Throwable var13) {
                  try {
                     dis.close();
                  } catch (Throwable var10) {
                     var13.addSuppressed(var10);
                  }

                  throw var13;
               }

               dis.close();
            } catch (Throwable var14) {
               try {
                  fis.close();
               } catch (Throwable var9) {
                  var14.addSuppressed(var9);
               }

               throw var14;
            }

            fis.close();
            return var4;
         } catch (FileNotFoundException var15) {
         } catch (IOException var16) {
            ExceptionLogger.logException(var16);
         }

         return -1;
      }
   }

   public List getLuaTraits() {
      return this.luatraits;
   }

   public void addLuaTrait(CharacterTrait trait) {
      this.getLuaTraits().add(trait);
   }

   public SurvivorDesc getLuaPlayerDesc() {
      return this.luaDesc;
   }

   public void setLuaPlayerDesc(SurvivorDesc desc) {
      this.luaDesc = desc;
   }

   public void KillCell() {
      this.helicopter.deactivate();
      CollisionManager.instance.contactMap.clear();
      ObjectIDManager.getInstance().clear();
      FliesSound.instance.reset();
      CorpseCount.instance.reset();
      IsoObjectPicker.Instance.Init();
      IsoChunkMap.SharedChunks.clear();
      SoundManager.instance.StopMusic();
      WorldSoundManager.instance.KillCell();
      ZombieGroupManager.instance.Reset();
      this.currentCell.Dispose();
      IsoSpriteManager.instance.Dispose();
      this.currentCell = null;
      IsoLot.Dispose();
      IsoGameCharacter.getSurvivorMap().clear();
      IsoPlayer.getInstance().setCurrent((IsoGridSquare)null);
      IsoPlayer.getInstance().setLast((IsoGridSquare)null);
      IsoPlayer.getInstance().square = null;
      RainManager.reset();
      IsoFireManager.Reset();
      ObjectAmbientEmitters.Reset();
      AnimalVocalsManager.Reset();
      ZombieVocalsManager.Reset();
      IsoWaterFlow.Reset();
      BuildingRoomsEditor.Reset();
      this.metaGrid.Dispose();
      this.biomeMap.Dispose();
      IsoBuilding.idCount = 0;
      instance = new IsoWorld();
   }

   public void setDrawWorld(boolean b) {
      this.drawWorld = b;
   }

   public void sceneCullZombies() {
      this.zombieWithModel.clear();
      this.zombieWithoutModel.clear();

      int c;
      for(c = 0; c < this.currentCell.getZombieList().size(); ++c) {
         IsoZombie z = (IsoZombie)this.currentCell.getZombieList().get(c);
         boolean withModel = false;

         for(int pn = 0; pn < IsoPlayer.numPlayers; ++pn) {
            IsoPlayer player = IsoPlayer.players[pn];
            if (player != null && z.current != null) {
               float screenX = (float)z.getScreenProperX(pn);
               float screenY = (float)z.getScreenProperY(pn);
               if (!(screenX < -100.0F) && !(screenY < -100.0F) && !(screenX > (float)(Core.getInstance().getOffscreenWidth(pn) + 100)) && !(screenY > (float)(Core.getInstance().getOffscreenHeight(pn) + 100)) && (z.getAlpha(pn) != 0.0F && z.legsSprite.def.alpha != 0.0F || z.current.isCouldSee(pn) || z.couldSeeHeadSquare(player))) {
                  withModel = true;
                  break;
               }
            }
         }

         if (withModel && z.isCurrentState(FakeDeadZombieState.instance())) {
            withModel = false;
         }

         if (withModel) {
            this.zombieWithModel.add(z);
         } else {
            this.zombieWithoutModel.add(z);
         }
      }

      this.timSort.doSort(this.zombieWithModel.getElements(), compScoreToPlayer, 0, this.zombieWithModel.size());
      c = 0;
      int count = 0;
      int tcount = 0;
      int tcountMax = true;
      PerformanceSettings.animationSkip = 0;

      int n;
      IsoZombie z;
      for(n = 0; n < this.zombieWithModel.size(); ++n) {
         z = (IsoZombie)this.zombieWithModel.get(n);
         if (tcount < 510) {
            if (!z.ghost) {
               ++count;
               ++tcount;
               z.setSceneCulled(false);
               if (z.legsSprite != null && z.legsSprite.modelSlot != null) {
                  if (count > PerformanceSettings.zombieAnimationSpeedFalloffCount) {
                     ++c;
                     count = 0;
                  }

                  if (tcount < PerformanceSettings.zombieBonusFullspeedFalloff) {
                     z.legsSprite.modelSlot.model.setInstanceSkip(count / PerformanceSettings.zombieBonusFullspeedFalloff);
                     count = 0;
                  } else {
                     z.legsSprite.modelSlot.model.setInstanceSkip(c + PerformanceSettings.animationSkip);
                  }

                  if (z.legsSprite.modelSlot.model.animPlayer != null) {
                     if (tcount >= PerformanceSettings.numberZombiesBlended) {
                        z.legsSprite.modelSlot.model.animPlayer.doBlending = false;
                     } else {
                        z.legsSprite.modelSlot.model.animPlayer.doBlending = !z.isAlphaAndTargetZero(0) || !z.isAlphaAndTargetZero(1) || !z.isAlphaAndTargetZero(2) || !z.isAlphaAndTargetZero(3);
                     }
                  }
               }
            }
         } else {
            z.setSceneCulled(true);
            if (z.hasAnimationPlayer()) {
               z.getAnimationPlayer().doBlending = false;
            }
         }
      }

      for(n = 0; n < this.zombieWithoutModel.size(); ++n) {
         z = (IsoZombie)this.zombieWithoutModel.get(n);
         if (z.hasActiveModel()) {
            z.setSceneCulled(true);
         }

         if (z.hasAnimationPlayer()) {
            z.getAnimationPlayer().doBlending = false;
         }
      }

   }

   public void sceneCullAnimals() {
      this.animalWithModel.clear();
      this.animalWithoutModel.clear();
      Iterator var1 = this.currentCell.getObjectList().iterator();

      while(true) {
         IsoMovingObject mo;
         do {
            if (!var1.hasNext()) {
               var1 = this.animalWithModel.iterator();

               IsoAnimal animal;
               while(var1.hasNext()) {
                  animal = (IsoAnimal)var1.next();
                  animal.setSceneCulled(false);
                  if (animal.hasAnimationPlayer()) {
                     animal.getAnimationPlayer().doBlending = true;
                  }
               }

               var1 = this.animalWithoutModel.iterator();

               while(var1.hasNext()) {
                  animal = (IsoAnimal)var1.next();
                  if (animal.hasActiveModel()) {
                     animal.setSceneCulled(true);
                  }

                  if (animal.hasAnimationPlayer()) {
                     animal.getAnimationPlayer().doBlending = false;
                  }
               }

               return;
            }

            mo = (IsoMovingObject)var1.next();
         } while(!(mo instanceof IsoAnimal));

         IsoAnimal animal = (IsoAnimal)mo;
         boolean withModel = false;

         for(int pn = 0; pn < IsoPlayer.numPlayers; ++pn) {
            IsoPlayer player = IsoPlayer.players[pn];
            if (player != null && animal.current != null) {
               float screenX = (float)((int)(IsoUtils.XToScreen(animal.getX(), animal.getY(), animal.getZ(), 0) - IsoCamera.cameras[pn].getOffX()));
               float screenY = (float)((int)(IsoUtils.YToScreen(animal.getX(), animal.getY(), animal.getZ(), 0) - IsoCamera.cameras[pn].getOffY()));
               if (!(screenX < -100.0F) && !(screenY < -100.0F) && !(screenX > (float)(Core.getInstance().getOffscreenWidth(pn) + 100)) && !(screenY > (float)(Core.getInstance().getOffscreenHeight(pn) + 100)) && (animal.getAlpha(pn) != 0.0F && animal.legsSprite.def.alpha != 0.0F || animal.current.isCouldSee(pn))) {
                  withModel = true;
                  break;
               }
            }
         }

         if (withModel && animal.isCurrentState(FakeDeadZombieState.instance())) {
            withModel = false;
         }

         if (withModel) {
            this.animalWithModel.add(animal);
         } else {
            this.animalWithoutModel.add(animal);
         }
      }
   }

   public void render() {
      AbstractPerformanceProfileProbe var1 = IsoWorld.s_performance.isoWorldRender.profile();

      try {
         this.renderInternal();
      } catch (Throwable var5) {
         if (var1 != null) {
            try {
               var1.close();
            } catch (Throwable var4) {
               var5.addSuppressed(var4);
            }
         }

         throw var5;
      }

      if (var1 != null) {
         var1.close();
      }

   }

   private void renderInternal() {
      if (this.drawWorld) {
         IsoGameCharacter isoGameCharacter = IsoCamera.getCameraCharacter();
         if (isoGameCharacter != null) {
            SpriteRenderer.instance.doCoreIntParam(0, isoGameCharacter.getX());
            SpriteRenderer.instance.doCoreIntParam(1, isoGameCharacter.getY());
            SpriteRenderer.instance.doCoreIntParam(2, IsoCamera.frameState.camCharacterZ);
            GameProfiler profiler = GameProfiler.getInstance();

            GameProfiler.ProfileArea var3;
            try {
               var3 = profiler.profile("Cull");

               try {
                  this.sceneCullZombies();
                  this.sceneCullAnimals();
               } catch (Throwable var16) {
                  if (var3 != null) {
                     try {
                        var3.close();
                     } catch (Throwable var10) {
                        var16.addSuppressed(var10);
                     }
                  }

                  throw var16;
               }

               if (var3 != null) {
                  var3.close();
               }
            } catch (Throwable var17) {
               ExceptionLogger.logException(var17);
            }

            try {
               WeatherFxMask.initMask();
               DeadBodyAtlas.instance.render();
               WorldItemAtlas.instance.render();
               this.currentCell.render();
               Gizmos.getInstance().render(IsoCamera.frameState.playerIndex);
               this.DrawIsoCursorHelper();
               DeadBodyAtlas.instance.renderDebug();
               var3 = profiler.profile("renderPathfinding");

               try {
                  this.renderPathfinding();
               } catch (Throwable var14) {
                  if (var3 != null) {
                     try {
                        var3.close();
                     } catch (Throwable var9) {
                        var14.addSuppressed(var9);
                     }
                  }

                  throw var14;
               }

               if (var3 != null) {
                  var3.close();
               }

               WorldSoundManager.instance.render();
               WorldFlares.debugRender();
               WorldMarkers.instance.debugRender();
               ObjectAmbientEmitters.getInstance().render();
               var3 = profiler.profile("renderVocals");

               try {
                  this.renderVocals();
               } catch (Throwable var13) {
                  if (var3 != null) {
                     try {
                        var3.close();
                     } catch (Throwable var8) {
                        var13.addSuppressed(var8);
                     }
                  }

                  throw var13;
               }

               if (var3 != null) {
                  var3.close();
               }

               var3 = profiler.profile("renderWeatherFX");

               try {
                  this.renderWeatherFX();
               } catch (Throwable var12) {
                  if (var3 != null) {
                     try {
                        var3.close();
                     } catch (Throwable var7) {
                        var12.addSuppressed(var7);
                     }
                  }

                  throw var12;
               }

               if (var3 != null) {
                  var3.close();
               }

               if (PerformanceSettings.fboRenderChunk) {
                  FBORenderAreaHighlights.getInstance().render();
                  BuildingRoomsEditor.getInstance().renderMain();
               }

               ParameterInside.renderDebug();
               LineDrawer.render();
               if (GameClient.client) {
                  ClientServerMap.render(IsoCamera.frameState.playerIndex);
                  PassengerMap.render(IsoCamera.frameState.playerIndex);
               }

               var3 = profiler.profile("Skybox");

               try {
                  SkyBox.getInstance().render();
               } catch (Throwable var11) {
                  if (var3 != null) {
                     try {
                        var3.close();
                     } catch (Throwable var6) {
                        var11.addSuppressed(var6);
                     }
                  }

                  throw var11;
               }

               if (var3 != null) {
                  var3.close();
               }
            } catch (Throwable var15) {
               ExceptionLogger.logException(var15);
            }

         }
      }
   }

   private void renderPathfinding() {
      if (PathfindNative.useNativeCode) {
         PathfindNative.instance.render();
         PathfindNativeRenderer.instance.render();
      } else {
         PolygonalMap2.instance.render();
      }

      BorderFinderRenderer.instance.render();
   }

   private void renderVocals() {
      AnimalVocalsManager.instance.render();
      ZombieVocalsManager.instance.render();
   }

   private void renderWeatherFX() {
      this.getCell().getWeatherFX().getDrawer(IsoWeatherFX.cloudId).startFrame();
      this.getCell().getWeatherFX().getDrawer(IsoWeatherFX.fogId).startFrame();
      this.getCell().getWeatherFX().getDrawer(IsoWeatherFX.snowId).startFrame();
      this.getCell().getWeatherFX().getDrawer(IsoWeatherFX.rainId).startFrame();
      WeatherFxMask.renderFxMask(IsoCamera.frameState.playerIndex);
   }

   public void DrawPlayerCone() {
      int playerIndex = IsoCamera.frameState.playerIndex;
      SpriteRenderer.instance.pushIsoView(IsoPlayer.getInstance().getX(), IsoPlayer.getInstance().getY(), IsoPlayer.getInstance().getZ(), (float)Math.toRadians(180.0), false);
      IsoPlayer player = IsoPlayer.getInstance();
      float cone = 1.0F + LightingJNI.calculateVisionCone(player);
      Vector2 lookVector = player.getLookVector(this.coneTempo1);
      BaseVehicle vehicle = player.getVehicle();
      if (vehicle != null && !player.isAiming() && !player.isLookingWhileInVehicle() && vehicle.isDriver(player) && vehicle.getCurrentSpeedKmHour() < -1.0F) {
         lookVector.rotate(3.1415927F);
      }

      if (cone < 0.0F) {
         cone = Math.abs(cone) + 1.0F;
      }

      cone = (float)((double)cone * 1.5707963267948966);
      this.coneTempo2.x = lookVector.x;
      this.coneTempo2.y = lookVector.y;
      this.coneTempo3.x = lookVector.x;
      this.coneTempo3.y = lookVector.y;
      this.coneTempo2.rotate(-cone);
      this.coneTempo3.rotate(cone);
      float offscreen1x = this.coneTempo2.x * 1000.0F;
      float offscreen1y = this.coneTempo2.y * 1000.0F;
      float offscreen2x = offscreen1x + -lookVector.x * 1000.0F;
      float offscreen2y = offscreen1y + -lookVector.y * 1000.0F;
      float offscreen3x = -lookVector.x * 1000.0F;
      float offscreen3y = -lookVector.y * 1000.0F;
      IndieGL.disableDepthTest();
      IndieGL.disableScissorTest();
      SpriteRenderer.instance.glBuffer(8, 0);
      if (ViewConeTextureFBO.instance.getTexture() != null) {
         SpriteRenderer.instance.glViewport(0, 0, ViewConeTextureFBO.instance.getTexture().getWidth(), ViewConeTextureFBO.instance.getTexture().getHeight());
      }

      IndieGL.StartShader(0);
      SpriteRenderer.instance.renderPoly(0.0F, 0.0F, offscreen1x, offscreen1y, offscreen2x, offscreen2y, offscreen3x, offscreen3y, 0.0F, 0.0F, 0.0F, 0.5F);
      IndieGL.EndShader();
      offscreen1x = this.coneTempo3.x * 1000.0F;
      offscreen1y = this.coneTempo3.y * 1000.0F;
      offscreen2x = offscreen1x + -lookVector.x * 1000.0F;
      offscreen2y = offscreen1y + -lookVector.y * 1000.0F;
      offscreen3x = -lookVector.x * 1000.0F;
      offscreen3y = -lookVector.y * 1000.0F;
      SpriteRenderer.instance.renderPoly(offscreen3x, offscreen3y, offscreen2x, offscreen2y, offscreen1x, offscreen1y, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.5F);
      SpriteRenderer.instance.glBuffer(9, 0);
      SpriteRenderer.instance.glViewport(IsoCamera.getScreenLeft(playerIndex), IsoCamera.getScreenTop(playerIndex), IsoCamera.getScreenWidth(playerIndex), IsoCamera.getScreenHeight(playerIndex));
      SpriteRenderer.instance.popIsoView();
      IndieGL.enableScissorTest();
   }

   public void DrawPlayerCone2() {
      IndieGL.glDepthMask(false);
      IndieGL.glBlendFunc(770, 771);
      if (SceneShaderStore.blurShader != null) {
         SceneShaderStore.blurShader.setTexture(ViewConeTextureFBO.instance.getTexture());
      }

      if (SceneShaderStore.blurShader != null) {
         IndieGL.StartShader(SceneShaderStore.blurShader, IsoPlayer.getPlayerIndex());
      }

      SpriteRenderer.instance.render(ViewConeTextureFBO.instance.getTexture(), 0.0F, (float)Core.getInstance().getOffscreenHeight(IsoPlayer.getPlayerIndex()), (float)Core.getInstance().getOffscreenWidth(IsoPlayer.getPlayerIndex()), (float)(-Core.getInstance().getOffscreenHeight(IsoPlayer.getPlayerIndex())), 1.0F, 1.0F, 1.0F, 1.0F, (Consumer)null);
      if (SceneShaderStore.blurShader != null) {
         IndieGL.EndShader();
      }

      IndieGL.glDepthMask(true);
   }

   private void DrawIsoCursorHelper() {
      if (Core.getInstance().getOffscreenBuffer() == null) {
         IsoPlayer player = IsoPlayer.getInstance();
         if (player != null && !player.isDead() && player.isAiming() && player.playerIndex == 0 && player.getJoypadBind() == -1) {
            if (!GameTime.isGamePaused()) {
               float alpha = 0.05F;
               switch (Core.getInstance().getIsoCursorVisibility()) {
                  case 0:
                     return;
                  case 1:
                     alpha = 0.05F;
                     break;
                  case 2:
                     alpha = 0.1F;
                     break;
                  case 3:
                     alpha = 0.15F;
                     break;
                  case 4:
                     alpha = 0.3F;
                     break;
                  case 5:
                     alpha = 0.5F;
                     break;
                  case 6:
                     alpha = 0.75F;
               }

               if (Core.getInstance().isFlashIsoCursor()) {
                  if (this.flashIsoCursorInc) {
                     this.flashIsoCursorA += 0.1F;
                     if (this.flashIsoCursorA >= 1.0F) {
                        this.flashIsoCursorInc = false;
                     }
                  } else {
                     this.flashIsoCursorA -= 0.1F;
                     if (this.flashIsoCursorA <= 0.0F) {
                        this.flashIsoCursorInc = true;
                     }
                  }

                  alpha = this.flashIsoCursorA;
               }

               Texture t = Texture.getSharedTexture("media/ui/isocursor.png");
               int width = (int)((float)(t.getWidth() * Core.tileScale) / 2.0F);
               int height = (int)((float)(t.getHeight() * Core.tileScale) / 2.0F);
               SpriteRenderer.instance.setDoAdditive(true);
               SpriteRenderer.instance.renderi(t, Mouse.getX() - width / 2, Mouse.getY() - height / 2, width, height, alpha, alpha, alpha, alpha, (Consumer)null);
               SpriteRenderer.instance.setDoAdditive(false);
            }
         }
      }
   }

   private void updateWorld() {
      this.currentCell.update();
      IsoRegions.update();
      HaloTextHelper.update();
      CollisionManager.instance.ResolveContacts();
      if (DebugOptions.instance.threadAnimation.getValue()) {
         MovingObjectUpdateScheduler var10000 = MovingObjectUpdateScheduler.instance;
         Objects.requireNonNull(var10000);
         animationThread = CompletableFuture.runAsync(var10000::postupdate);
      } else {
         GameProfiler.ProfileArea var1 = GameProfiler.getInstance().profile("Animation");

         try {
            MovingObjectUpdateScheduler.instance.postupdate();
         } catch (Throwable var5) {
            if (var1 != null) {
               try {
                  var1.close();
               } catch (Throwable var4) {
                  var5.addSuppressed(var4);
               }
            }

            throw var5;
         }

         if (var1 != null) {
            var1.close();
         }
      }

   }

   public void FinishAnimation() {
      if (animationThread != null) {
         GameProfiler.ProfileArea var1 = GameProfiler.getInstance().profile("Wait Animation");

         try {
            animationThread.join();
         } catch (Throwable var5) {
            if (var1 != null) {
               try {
                  var1.close();
               } catch (Throwable var4) {
                  var5.addSuppressed(var4);
               }
            }

            throw var5;
         }

         if (var1 != null) {
            var1.close();
         }

         animationThread = null;
      }

   }

   public void update() {
      AbstractPerformanceProfileProbe var1 = IsoWorld.s_performance.isoWorldUpdate.profile();

      try {
         this.updateInternal();
      } catch (Throwable var6) {
         if (var1 != null) {
            try {
               var1.close();
            } catch (Throwable var4) {
               var6.addSuppressed(var4);
            }
         }

         throw var6;
      }

      if (var1 != null) {
         var1.close();
      }

      GameProfiler.ProfileArea var8 = GameProfiler.getInstance().profile("Update DZ");

      try {
         DesignationZone.update();
      } catch (Throwable var7) {
         if (var8 != null) {
            try {
               var8.close();
            } catch (Throwable var5) {
               var7.addSuppressed(var5);
            }
         }

         throw var7;
      }

      if (var8 != null) {
         var8.close();
      }

   }

   private void updateInternal() {
      ++this.frameNo;
      if (GameServer.server) {
         try {
            VehicleManager.instance.serverUpdate();
         } catch (Exception var10) {
            DebugType.General.printException(var10, LogSeverity.Error);
         }
      }

      WorldSimulation.instance.update();
      HutchManager.getInstance().updateAll();
      ImprovedFog.update();
      this.helicopter.update();
      long currentMS = System.currentTimeMillis();
      if (currentMS - this.emitterUpdateMs >= 30L) {
         this.emitterUpdateMs = currentMS;
         this.emitterUpdate = true;
      } else {
         this.emitterUpdate = false;
      }

      for(int n = 0; n < this.currentEmitters.size(); ++n) {
         BaseSoundEmitter e = (BaseSoundEmitter)this.currentEmitters.get(n);
         if (this.emitterUpdate || e.hasSoundsToStart()) {
            e.tick();
         }

         if (e.isEmpty()) {
            if (e instanceof FMODSoundEmitter) {
               FMODSoundEmitter fmodSoundEmitter = (FMODSoundEmitter)e;
               fmodSoundEmitter.clearParameters();
            }

            this.currentEmitters.remove(n);
            this.freeEmitters.push(e);
            IsoObject owner = (IsoObject)this.emitterOwners.remove(e);
            if (owner != null && owner.emitter == e) {
               owner.emitter = null;
            }

            --n;
         }
      }

      if (!GameClient.client && !GameServer.server) {
         IsoMetaCell currentChunk = this.metaGrid.getCurrentCellData();
         if (currentChunk != null) {
            currentChunk.checkTriggers();
         }
      }

      WorldSoundManager.instance.initFrame();
      ZombieGroupManager.instance.preupdate();
      OnceEvery.update();
      CollisionManager.instance.initUpdate();
      CompletableFuture thread = null;
      if (DebugOptions.instance.threadWorld.getValue()) {
         thread = CompletableFuture.runAsync(this::updateThread, PZForkJoinPool.commonPool());
      }

      GameProfiler profiler = GameProfiler.getInstance();
      GameProfiler.ProfileArea var17 = profiler.profile("Update Climate");

      try {
         ClimateManager.getInstance().update();
      } catch (Throwable var11) {
         if (var17 != null) {
            try {
               var17.close();
            } catch (Throwable var8) {
               var11.addSuppressed(var8);
            }
         }

         throw var11;
      }

      if (var17 != null) {
         var17.close();
      }

      this.updateWorld();
      if (thread != null) {
         var17 = profiler.profile("Wait Thread");

         try {
            thread.join();
         } catch (Throwable var12) {
            if (var17 != null) {
               try {
                  var17.close();
               } catch (Throwable var9) {
                  var12.addSuppressed(var9);
               }
            }

            throw var12;
         }

         if (var17 != null) {
            var17.close();
         }
      } else {
         this.updateThread();
      }

      AnimationPlayerRecorder.onPostUpdateWorld();
   }

   private void updateThread() {
      GameProfiler profiler = GameProfiler.getInstance();
      GameProfiler.ProfileArea var2 = profiler.profile("Update Buildings");

      try {
         this.updateBuildings();
      } catch (Throwable var11) {
         if (var2 != null) {
            try {
               var2.close();
            } catch (Throwable var7) {
               var11.addSuppressed(var7);
            }
         }

         throw var11;
      }

      if (var2 != null) {
         var2.close();
      }

      var2 = profiler.profile("Update Static");

      try {
         ObjectRenderEffects.updateStatic();
      } catch (Throwable var14) {
         if (var2 != null) {
            try {
               var2.close();
            } catch (Throwable var9) {
               var14.addSuppressed(var9);
            }
         }

         throw var14;
      }

      if (var2 != null) {
         var2.close();
      }

      for(int i = 0; i < this.addCoopPlayers.size(); ++i) {
         AddCoopPlayer acp = (AddCoopPlayer)this.addCoopPlayers.get(i);
         acp.update();
         if (acp.isFinished()) {
            this.addCoopPlayers.remove(i--);
         }
      }

      if (!GameServer.server) {
         IsoPlayer.UpdateRemovedEmitters();
      }

      var2 = profiler.profile("Update DBs");

      try {
         this.updateDBs();
      } catch (Throwable var12) {
         if (var2 != null) {
            try {
               var2.close();
            } catch (Throwable var5) {
               var12.addSuppressed(var5);
            }
         }

         throw var12;
      }

      if (var2 != null) {
         var2.close();
      }

      if (this.updateSafehousePlayers > 0 && (GameServer.server || GameClient.client)) {
         --this.updateSafehousePlayers;
         if (this.updateSafehousePlayers == 0) {
            this.updateSafehousePlayers = 200;
            SafeHouse.updateSafehousePlayersConnected();
         }
      }

      var2 = profiler.profile("Update VA");

      try {
         AnimalZones.updateVirtualAnimals();
      } catch (Throwable var13) {
         if (var2 != null) {
            try {
               var2.close();
            } catch (Throwable var8) {
               var13.addSuppressed(var8);
            }
         }

         throw var13;
      }

      if (var2 != null) {
         var2.close();
      }

      var2 = profiler.profile("Load Animal Defs");

      try {
         AnimalTracksDefinitions.loadTracksDefinitions();
      } catch (Throwable var10) {
         if (var2 != null) {
            try {
               var2.close();
            } catch (Throwable var6) {
               var10.addSuppressed(var6);
            }
         }

         throw var10;
      }

      if (var2 != null) {
         var2.close();
      }

   }

   private void updateBuildings() {
      for(int n = 0; n < this.currentCell.getBuildingList().size(); ++n) {
         ((IsoBuilding)this.currentCell.getBuildingList().get(n)).update();
      }

   }

   private void updateDBs() {
      try {
         if (PlayerDB.isAvailable()) {
            PlayerDB.getInstance().updateMain();
         }

         VehiclesDB2.instance.updateMain();
      } catch (Exception var2) {
         ExceptionLogger.logException(var2);
      }

   }

   public IsoCell getCell() {
      return this.currentCell;
   }

   private void PopulateCellWithSurvivors() {
   }

   public int getWorldSquareY() {
      return this.currentCell.chunkMap[IsoPlayer.getPlayerIndex()].worldY * 8;
   }

   public int getWorldSquareX() {
      return this.currentCell.chunkMap[IsoPlayer.getPlayerIndex()].worldX * 8;
   }

   public IsoMetaChunk getMetaChunk(int wx, int wy) {
      return this.metaGrid.getChunkData(wx, wy);
   }

   public IsoMetaChunk getMetaChunkFromTile(int wx, int wy) {
      return this.metaGrid.getChunkDataFromTile(wx, wy);
   }

   public float getGlobalTemperature() {
      return ClimateManager.getInstance().getTemperature();
   }

   public String getWeather() {
      return this.weather;
   }

   public void setWeather(String weather) {
      this.weather = weather;
   }

   public int getLuaSpawnCellX() {
      return PZMath.coordmodulo(this.luaPosX, 256);
   }

   /** @deprecated */
   @Deprecated
   public void setLuaSpawnCellX(int luaSpawnCellX) {
   }

   public int getLuaSpawnCellY() {
      return PZMath.coordmodulo(this.luaPosY, 256);
   }

   /** @deprecated */
   @Deprecated
   public void setLuaSpawnCellY(int luaSpawnCellY) {
   }

   public int getLuaPosX() {
      return this.luaPosX;
   }

   public void setLuaPosX(int luaPosX) {
      this.luaPosX = luaPosX;
   }

   public int getLuaPosY() {
      return this.luaPosY;
   }

   public void setLuaPosY(int luaPosY) {
      this.luaPosY = luaPosY;
   }

   public int getLuaPosZ() {
      return this.luaPosZ;
   }

   public void setLuaPosZ(int luaPosZ) {
      this.luaPosZ = luaPosZ;
   }

   public void setSpawnRegion(String spawnRegionName) {
      if (spawnRegionName != null) {
         this.spawnRegionName = spawnRegionName;
      }

   }

   public String getSpawnRegion() {
      return this.spawnRegionName;
   }

   public String getWorld() {
      return Core.gameSaveWorld;
   }

   public void transmitWeather() {
      if (GameServer.server) {
         GameServer.sendWeather();
      }
   }

   public boolean isValidSquare(int x, int y, int z) {
      return z >= -32 && z <= 31 ? this.metaGrid.isValidSquare(x, y) : false;
   }

   public ArrayList getRandomizedZoneList() {
      return this.randomizedZoneList;
   }

   public RandomizedZoneStoryBase getRandomizedZoneStoryByName(String name) {
      for(int i = 0; i < this.randomizedZoneList.size(); ++i) {
         RandomizedZoneStoryBase rzs = (RandomizedZoneStoryBase)this.randomizedZoneList.get(i);
         if (rzs.getName().equalsIgnoreCase(name)) {
            return rzs;
         }
      }

      return null;
   }

   public ArrayList getRandomizedBuildingList() {
      return this.randomizedBuildingList;
   }

   public ArrayList getRandomizedVehicleStoryList() {
      return this.randomizedVehicleStoryList;
   }

   public RandomizedVehicleStoryBase getRandomizedVehicleStoryByName(String name) {
      for(int i = 0; i < this.randomizedVehicleStoryList.size(); ++i) {
         RandomizedVehicleStoryBase rvs = (RandomizedVehicleStoryBase)this.randomizedVehicleStoryList.get(i);
         if (rvs.getName().equalsIgnoreCase(name)) {
            return rvs;
         }
      }

      return null;
   }

   public RandomizedBuildingBase getRBBasic() {
      return this.rbBasic;
   }

   public RandomizedWorldBase getRandomizedWorldBase() {
      return this.randomizedWorldBase;
   }

   public static boolean getZombiesDisabled() {
      return noZombies || !SystemDisabler.doZombieCreation || SandboxOptions.instance.zombies.getValue() == 6;
   }

   public static boolean getZombiesEnabled() {
      return !getZombiesDisabled();
   }

   public ClimateManager getClimateManager() {
      return ClimateManager.getInstance();
   }

   public IsoPuddles getPuddlesManager() {
      return IsoPuddles.getInstance();
   }

   public static int getWorldVersion() {
      return 249;
   }

   public HashMap getSpawnedZombieZone() {
      return this.spawnedZombieZone;
   }

   public int getTimeSinceLastSurvivorInHorde() {
      return this.timeSinceLastSurvivorInHorde;
   }

   public void setTimeSinceLastSurvivorInHorde(int timeSinceLastSurvivorInHorde) {
      this.timeSinceLastSurvivorInHorde = timeSinceLastSurvivorInHorde;
   }

   public float getWorldAgeDays() {
      float worldAgeDays = (float)GameTime.getInstance().getWorldAgeHours() / 24.0F;
      worldAgeDays += (float)((SandboxOptions.instance.timeSinceApo.getValue() - 1) * 30);
      return worldAgeDays;
   }

   public HashMap getAllTiles() {
      return this.allTiles;
   }

   public ArrayList getAllTilesName() {
      ArrayList result = new ArrayList(this.allTiles.keySet());
      Collections.sort(result);
      return result;
   }

   public ArrayList getAllTiles(String filename) {
      return (ArrayList)this.allTiles.get(filename);
   }

   public boolean isHydroPowerOn() {
      return this.hydroPowerOn;
   }

   public void setHydroPowerOn(boolean on) {
      this.hydroPowerOn = on;
   }

   public ArrayList getTileImageNames() {
      return this.tileImages;
   }

   public static void parseDistributions() {
      ItemPickerJava.Parse();
      ItemPickerJava.InitSandboxLootSettings();
   }

   public void setRules(Rules rules) {
      this.rules = rules;
   }

   public Rules getRules() {
      return this.rules;
   }

   public void setWgChunk(WorldGenChunk wgChunk) {
      this.wgChunk = wgChunk;
   }

   public WorldGenChunk getWgChunk() {
      return this.wgChunk;
   }

   public void setBlending(Blending blending) {
      this.blending = blending;
   }

   public Blending getBlending() {
      return this.blending;
   }

   public void setAttachmentsHandler(AttachmentsHandler attachmentsHandler) {
      this.attachmentsHandler = attachmentsHandler;
   }

   public AttachmentsHandler getAttachmentsHandler() {
      return this.attachmentsHandler;
   }

   public void setZoneGenerator(ZoneGenerator zoneGenerator) {
      this.zoneGenerator = zoneGenerator;
   }

   public ZoneGenerator getZoneGenerator() {
      return this.zoneGenerator;
   }

   public void setBiomeMap(BiomeMap biomeMap) {
      this.biomeMap = biomeMap;
   }

   public BiomeMap getBiomeMap() {
      return this.biomeMap;
   }

   public void setZombieVoronois(List zombieVoronois) {
      this.zombieVoronois = zombieVoronois;
   }

   public List getZombieVoronois() {
      return this.zombieVoronois;
   }

   static {
      LUA_CHECKSUM_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(60L);
      instance = new IsoWorld();
      compScoreToPlayer = new CompScoreToPlayer();
      mapPath = "media/";
      mapUseJar = true;
      PropertyValueMap = new HashMap();
      savedWorldVersion = -1;
      totalWorldVersion = -1;
   }

   private static class CompScoreToPlayer implements Comparator {
      public int compare(IsoZombie a, IsoZombie b) {
         float aScore = this.getScore(a);
         float bScore = this.getScore(b);
         if (aScore < bScore) {
            return 1;
         } else {
            return aScore > bScore ? -1 : 0;
         }
      }

      public float getScore(IsoZombie zombie) {
         float maxScore = Float.MIN_VALUE;

         for(int pn = 0; pn < 4; ++pn) {
            IsoPlayer player = IsoPlayer.players[pn];
            if (player != null && player.current != null) {
               float score = player.getZombieRelevenceScore(zombie);
               maxScore = Math.max(maxScore, score);
            }
         }

         return maxScore;
      }
   }

   private static class s_performance {
      static final PerformanceProfileProbe isoWorldUpdate = new PerformanceProfileProbe("IsoWorld.update");
      static final PerformanceProfileProbe isoWorldRender = new PerformanceProfileProbe("IsoWorld.render");
   }

   public class Frame {
      public ArrayList xPos;
      public ArrayList yPos;
      public ArrayList type;

      public Frame(final IsoWorld this$0) {
         Objects.requireNonNull(this$0);
         super();
         this.xPos = new ArrayList();
         this.yPos = new ArrayList();
         this.type = new ArrayList();
         Iterator it = IsoWorld.instance.currentCell.getObjectList().iterator();

         while(it != null && it.hasNext()) {
            IsoMovingObject o = (IsoMovingObject)it.next();
            byte type;
            if (o instanceof IsoPlayer) {
               type = 0;
            } else if (o instanceof IsoSurvivor) {
               type = 1;
            } else {
               if (!(o instanceof IsoZombie)) {
                  continue;
               }

               IsoZombie isoZombie = (IsoZombie)o;
               if (isoZombie.ghost) {
                  continue;
               }

               type = 2;
            }

            this.xPos.add(PZMath.fastfloor(o.getX()));
            this.yPos.add(PZMath.fastfloor(o.getY()));
            this.type.add(Integer.valueOf(type));
         }

      }
   }

   public static class MetaCell {
      public int x;
      public int y;
      public int zombieCount;
      public IsoDirections zombieMigrateDirection;
      public int[][] from = new int[3][3];
   }

   private static class CompDistToPlayer implements Comparator {
      public float px;
      public float py;

      public int compare(IsoZombie a, IsoZombie b) {
         float aScore = IsoUtils.DistanceManhatten((float)PZMath.fastfloor(a.getX()), (float)PZMath.fastfloor(a.getY()), this.px, this.py);
         float bScore = IsoUtils.DistanceManhatten((float)PZMath.fastfloor(b.getX()), (float)PZMath.fastfloor(b.getY()), this.px, this.py);
         if (aScore < bScore) {
            return -1;
         } else {
            return aScore > bScore ? 1 : 0;
         }
      }
   }
}