Fix map data hopefully.

This commit is contained in:
SilicaAndPina 2021-02-24 09:52:36 +13:00
parent b80984b92e
commit 83e274c828
7 changed files with 170 additions and 144 deletions

Binary file not shown.

View file

@ -105,7 +105,7 @@ namespace HISP.Game.Items
public static void DespawnItems() public static void DespawnItems()
{ {
Database.DecrementDroppedItemDespawnTimer(); Database.DecrementDroppedItemDespawnTimer();
Database.RemoveDespawningItems(); // GO-GO-GO-GOGOGOGO GOTTA GO FAST!!!
for (int i = 0; i < droppedItemsList.Count; i++) for (int i = 0; i < droppedItemsList.Count; i++)
{ {
if (droppedItemsList[i] == null) // Item removed in another thread. if (droppedItemsList[i] == null) // Item removed in another thread.
@ -120,7 +120,7 @@ namespace HISP.Game.Items
Logger.DebugPrint("Despawned Item at " + droppedItemsList[i].X + ", " + droppedItemsList[i].Y); Logger.DebugPrint("Despawned Item at " + droppedItemsList[i].X + ", " + droppedItemsList[i].Y);
droppedItemsList.Remove(droppedItemsList[i]); droppedItemsList.Remove(droppedItemsList[i]);
Database.RemoveDroppedItem(droppedItemsList[i].Instance.RandomId);
} }
} }
} }
@ -134,49 +134,86 @@ namespace HISP.Game.Items
droppedItemsList.Add(droppedItem); droppedItemsList.Add(droppedItem);
Database.AddDroppedItem(droppedItem); Database.AddDroppedItem(droppedItem);
} }
public static void GenerateItems() public static void GenerateItems(bool isFirstLoad=false)
{ {
if (isFirstLoad)
Logger.InfoPrint("Generating items, (this may take awhile on a fresh database!)"); Logger.InfoPrint("Generating items, (this may take awhile on a fresh database!)");
else
Logger.InfoPrint("Generating items.");
int newItems = 0; int newItems = 0;
foreach (Item.ItemInformation item in Item.Items) foreach (Item.ItemInformation item in Item.Items)
{ {
int count = GetCountOfItem(item); int count = GetCountOfItem(item);
while (count < item.SpawnParamaters.SpawnCap) do
{ {
if (count < item.SpawnParamaters.SpawnCap)
count++;
int despawnTimer = 1440;
if (item.SpawnParamaters.SpawnInZone != null)
{ {
World.Zone spawnArea = World.GetZoneByName(item.SpawnParamaters.SpawnInZone);
while(true) count++;
int despawnTimer = 1440;
if (isFirstLoad)
despawnTimer = GameServer.RandomNumberGenerator.Next(0, 1440 + 1);
if (item.SpawnParamaters.SpawnInZone != null)
{ {
// Pick a random location inside the zone World.Zone spawnArea = World.GetZoneByName(item.SpawnParamaters.SpawnInZone);
int tryX = GameServer.RandomNumberGenerator.Next(spawnArea.StartX, spawnArea.EndX);
int tryY = GameServer.RandomNumberGenerator.Next(spawnArea.StartY, spawnArea.EndY);
while (true)
if (World.InSpecialTile(tryX, tryY))
continue;
if (Map.CheckPassable(tryX, tryY)) // Can the player walk here?
{ {
int TileID = Map.GetTileId(tryX, tryY, false); // Pick a random location inside the zone
string TileType = Map.TerrainTiles[TileID - 1].Type; // Is it the right type? int tryX = GameServer.RandomNumberGenerator.Next(spawnArea.StartX, spawnArea.EndX);
int tryY = GameServer.RandomNumberGenerator.Next(spawnArea.StartY, spawnArea.EndY);
if (item.SpawnParamaters.SpawnOnTileType == TileType)
if (World.InSpecialTile(tryX, tryY))
continue;
if (Map.CheckPassable(tryX, tryY)) // Can the player walk here?
{ {
if (GetItemsAt(tryX, tryY).Length > 25) // Max items in one tile. int TileID = Map.GetTileId(tryX, tryY, false);
string TileType = Map.TerrainTiles[TileID - 1].Type; // Is it the right type?
if (item.SpawnParamaters.SpawnOnTileType == TileType)
{
if (GetItemsAt(tryX, tryY).Length > 25) // Max items in one tile.
continue;
ItemInstance instance = new ItemInstance(item.Id);
AddItem(instance, tryX, tryY, despawnTimer);
Logger.DebugPrint("Created Item ID: " + instance.ItemId + " in ZONE: " + spawnArea.Name + " at: X: " + tryX + " Y: " + tryY);
newItems++;
break;
}
else
{
continue;
}
}
else
{
continue;
}
}
}
else if (item.SpawnParamaters.SpawnOnSpecialTile != null)
{
while (true)
{
// Pick a random special tile
World.SpecialTile[] possileTiles = World.GetSpecialTilesByName(item.SpawnParamaters.SpawnOnSpecialTile);
World.SpecialTile spawnOn = possileTiles[GameServer.RandomNumberGenerator.Next(0, possileTiles.Length)];
if (Map.CheckPassable(spawnOn.X, spawnOn.Y))
{
if (GetItemsAt(spawnOn.X, spawnOn.Y).Length > 25) // Max items in one tile.
continue; continue;
ItemInstance instance = new ItemInstance(item.Id); ItemInstance instance = new ItemInstance(item.Id);
AddItem(instance, tryX, tryY, despawnTimer); AddItem(instance, spawnOn.X, spawnOn.Y, despawnTimer);
Logger.DebugPrint("Created Item ID: " + instance.ItemId + " in ZONE: " + spawnArea.Name + " at: X: " + tryX + " Y: " + tryY); Logger.DebugPrint("Created Item ID: " + instance.ItemId + " at: X: " + spawnOn.X + " Y: " + spawnOn.Y);
newItems++; newItems++;
break; break;
} }
@ -185,115 +222,49 @@ namespace HISP.Game.Items
continue; continue;
} }
} }
else
{
continue;
}
} }
else if (item.SpawnParamaters.SpawnNearSpecialTile != null)
}
else if (item.SpawnParamaters.SpawnOnSpecialTile != null)
{
while(true)
{ {
// Pick a random special tile while (true)
World.SpecialTile[] possileTiles = World.GetSpecialTilesByName(item.SpawnParamaters.SpawnOnSpecialTile);
World.SpecialTile spawnOn = possileTiles[GameServer.RandomNumberGenerator.Next(0, possileTiles.Length)];
if (Map.CheckPassable(spawnOn.X, spawnOn.Y))
{ {
if (GetItemsAt(spawnOn.X, spawnOn.Y).Length > 25) // Max items in one tile. // Pick a random special tile
continue; World.SpecialTile[] possileTiles = World.GetSpecialTilesByName(item.SpawnParamaters.SpawnNearSpecialTile);
World.SpecialTile spawnNearTile = possileTiles[GameServer.RandomNumberGenerator.Next(0, possileTiles.Length)];
ItemInstance instance = new ItemInstance(item.Id); // Pick a direction to try spawn in
AddItem(instance, spawnOn.X, spawnOn.Y, despawnTimer);
Logger.DebugPrint("Created Item ID: " + instance.ItemId + " at: X: " + spawnOn.X + " Y: " + spawnOn.Y);
newItems++;
break;
}
else
{
continue;
}
}
} int direction = GameServer.RandomNumberGenerator.Next(0, 4);
else if (item.SpawnParamaters.SpawnNearSpecialTile != null) int tryX = 0;
{ int tryY = 0;
while (true) if (direction == 0)
{ {
// Pick a random special tile tryX = spawnNearTile.X + 1;
World.SpecialTile[] possileTiles = World.GetSpecialTilesByName(item.SpawnParamaters.SpawnNearSpecialTile); tryY = spawnNearTile.Y;
World.SpecialTile spawnNearTile = possileTiles[GameServer.RandomNumberGenerator.Next(0, possileTiles.Length)]; }
else if (direction == 1)
{
tryX = spawnNearTile.X - 1;
tryY = spawnNearTile.Y;
}
else if (direction == 3)
{
tryX = spawnNearTile.X;
tryY = spawnNearTile.Y + 1;
}
else if (direction == 4)
{
tryX = spawnNearTile.X;
tryY = spawnNearTile.Y - 1;
}
if (World.InSpecialTile(tryX, tryY))
{
World.SpecialTile tile = World.GetSpecialTile(tryX, tryY);
if (tile.Code != null)
continue;
}
// Pick a direction to try spawn in if (Map.CheckPassable(tryX, tryY))
int direction = GameServer.RandomNumberGenerator.Next(0, 4);
int tryX = 0;
int tryY = 0;
if (direction == 0)
{
tryX = spawnNearTile.X + 1;
tryY = spawnNearTile.Y;
}
else if(direction == 1)
{
tryX = spawnNearTile.X - 1;
tryY = spawnNearTile.Y;
}
else if(direction == 3)
{
tryX = spawnNearTile.X;
tryY = spawnNearTile.Y + 1;
}
else if (direction == 4)
{
tryX = spawnNearTile.X;
tryY = spawnNearTile.Y - 1;
}
if (World.InSpecialTile(tryX, tryY))
{
World.SpecialTile tile = World.GetSpecialTile(tryX, tryY);
if (tile.Code != null)
continue;
}
if (Map.CheckPassable(tryX, tryY))
{
if (GetItemsAt(tryX, tryY).Length > 25) // Max here
continue;
ItemInstance instance = new ItemInstance(item.Id);
AddItem(instance, tryX, tryY, despawnTimer);
Logger.DebugPrint("Created Item ID: " + instance.ItemId + " at: X: " + tryX + " Y: " + tryY);
newItems++;
break;
}
else
{
continue;
}
}
}
else if (item.SpawnParamaters.SpawnOnTileType != null)
{
while (true)
{
// Pick a random location:
int tryX = GameServer.RandomNumberGenerator.Next(0, Map.Width);
int tryY = GameServer.RandomNumberGenerator.Next(0, Map.Height);
if (World.InSpecialTile(tryX, tryY))
continue;
if (Map.CheckPassable(tryX, tryY)) // Can the player walk here?
{
int TileID = Map.GetTileId(tryX, tryY, false);
string TileType = Map.TerrainTiles[TileID - 1].Type; // Is it the right type?
if (item.SpawnParamaters.SpawnOnTileType == TileType)
{ {
if (GetItemsAt(tryX, tryY).Length > 25) // Max here if (GetItemsAt(tryX, tryY).Length > 25) // Max here
continue; continue;
@ -303,32 +274,67 @@ namespace HISP.Game.Items
Logger.DebugPrint("Created Item ID: " + instance.ItemId + " at: X: " + tryX + " Y: " + tryY); Logger.DebugPrint("Created Item ID: " + instance.ItemId + " at: X: " + tryX + " Y: " + tryY);
newItems++; newItems++;
break; break;
} }
else else
{ {
continue; continue;
} }
} }
else
}
else if (item.SpawnParamaters.SpawnOnTileType != null)
{
while (true)
{ {
continue; // Pick a random location:
int tryX = GameServer.RandomNumberGenerator.Next(0, Map.Width);
int tryY = GameServer.RandomNumberGenerator.Next(0, Map.Height);
if (World.InSpecialTile(tryX, tryY))
continue;
if (Map.CheckPassable(tryX, tryY)) // Can the player walk here?
{
int TileID = Map.GetTileId(tryX, tryY, false);
string TileType = Map.TerrainTiles[TileID - 1].Type; // Is it the right type?
if (item.SpawnParamaters.SpawnOnTileType == TileType)
{
if (GetItemsAt(tryX, tryY).Length > 25) // Max here
continue;
ItemInstance instance = new ItemInstance(item.Id);
AddItem(instance, tryX, tryY, despawnTimer);
Logger.DebugPrint("Created Item ID: " + instance.ItemId + " at: X: " + tryX + " Y: " + tryY);
newItems++;
break;
}
else
{
continue;
}
}
else
{
continue;
}
} }
} }
} }
} while (isFirstLoad && (count < item.SpawnParamaters.SpawnCap));
}
} }
} }
public static void Init() public static void Init()
{ {
ReadFromDatabase(); ReadFromDatabase();
GenerateItems(); GenerateItems(true);
} }
} }

View file

@ -107,7 +107,7 @@ namespace HISP.Game
Logger.ErrorPrint("Map file not found."); Logger.ErrorPrint("Map file not found.");
return; return;
} }
Logger.InfoPrint("Loading Map Data (" + ConfigReader.MapFile + ")");
byte[] worldMap = File.ReadAllBytes(ConfigReader.MapFile); byte[] worldMap = File.ReadAllBytes(ConfigReader.MapFile);
@ -118,7 +118,6 @@ namespace HISP.Game
oMapData = new byte[Width * Height]; oMapData = new byte[Width * Height];
int ii = 8; int ii = 8;
for (int i = 0; i < MapData.Length; i++) for (int i = 0; i < MapData.Length; i++)
{ {
oMapData[i] = worldMap[ii]; oMapData[i] = worldMap[ii];
@ -127,6 +126,7 @@ namespace HISP.Game
} }
worldMap = null; worldMap = null;
Logger.InfoPrint("Map Data Loaded!");
} }
} }

View file

@ -191,7 +191,11 @@ namespace HISP.Game
return; return;
if (UdlrScriptPos >= UDLRScript.Length) if (UdlrScriptPos >= UDLRScript.Length)
{
X = UDLRStartX;
Y = UDLRStartY;
UdlrScriptPos = 0; UdlrScriptPos = 0;
}
switch (UDLRScript.ToLower()[UdlrScriptPos]) switch (UDLRScript.ToLower()[UdlrScriptPos])
{ {

View file

@ -3936,6 +3936,21 @@ namespace HISP.Server
} }
} }
public static void RemoveDespawningItems()
{
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "DELETE FROM droppeditems WHERE despawnTimer <=0";
sqlCommand.Prepare();
sqlCommand.ExecuteNonQuery();
sqlCommand.Dispose();
}
}
public static void RemoveDroppedItem(int randomId) public static void RemoveDroppedItem(int randomId)
{ {
using (MySqlConnection db = new MySqlConnection(ConnectionString)) using (MySqlConnection db = new MySqlConnection(ConnectionString))
@ -3984,7 +3999,7 @@ namespace HISP.Server
MySqlCommand sqlCommand = db.CreateCommand(); MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "UPDATE DroppedItems SET DespawnTimer=DespawnTimer-5"; sqlCommand.CommandText = "UPDATE DroppedItems SET DespawnTimer=DespawnTimer-1";
sqlCommand.ExecuteNonQuery(); sqlCommand.ExecuteNonQuery();
sqlCommand.Dispose(); sqlCommand.Dispose();

View file

@ -222,7 +222,7 @@ namespace HISP.Server
item.Effects = effectsList; item.Effects = effectsList;
item.SpawnParamaters = new Item.SpawnRules(); item.SpawnParamaters = new Item.SpawnRules();
item.SpawnParamaters.SpawnCap = gameData.item.item_list[i].spawn_parameters.spawn_cap; item.SpawnParamaters.SpawnCap = gameData.item.item_list[i].spawn_parameters.spawn_cap;
item.SpawnParamaters.SpawnInZone = gameData.item.item_list[i].spawn_parameters.spawn_in_zone; item.SpawnParamaters.SpawnInZone = gameData.item.item_list[i].spawn_parameters.spawn_in_area;
item.SpawnParamaters.SpawnOnTileType = gameData.item.item_list[i].spawn_parameters.spawn_on_tile_type; item.SpawnParamaters.SpawnOnTileType = gameData.item.item_list[i].spawn_parameters.spawn_on_tile_type;
item.SpawnParamaters.SpawnOnSpecialTile = gameData.item.item_list[i].spawn_parameters.spawn_on_special_tile; item.SpawnParamaters.SpawnOnSpecialTile = gameData.item.item_list[i].spawn_parameters.spawn_on_special_tile;
item.SpawnParamaters.SpawnNearSpecialTile = gameData.item.item_list[i].spawn_parameters.spawn_near_special_tile; item.SpawnParamaters.SpawnNearSpecialTile = gameData.item.item_list[i].spawn_parameters.spawn_near_special_tile;

View file

@ -130,8 +130,6 @@ namespace HISP.Server
if (totalMinutesElapsed % 5 == 0) if (totalMinutesElapsed % 5 == 0)
{ {
Treasure.AddValue(); Treasure.AddValue();
DroppedItems.DespawnItems();
DroppedItems.GenerateItems();
} }
@ -171,6 +169,9 @@ namespace HISP.Server
Database.TpOfflinePlayersBackToUniterForOfflinePlayers(); Database.TpOfflinePlayersBackToUniterForOfflinePlayers();
Database.DeleteExpiredLeasedHorsesForOfflinePlayers(); Database.DeleteExpiredLeasedHorsesForOfflinePlayers();
DroppedItems.DespawnItems();
DroppedItems.GenerateItems();
WildHorse.Update(); WildHorse.Update();
Npc.WanderNpcs(); Npc.WanderNpcs();