This commit is contained in:
SilicaAndPina 2021-02-06 12:04:35 +13:00
parent 7216ade563
commit 5e460923dc
8 changed files with 132 additions and 99 deletions

View file

@ -50,6 +50,7 @@
"sec_code":{ "sec_code":{
"invalid_sec_code":"Data Code Error. You did not get the bonus. You should reconnect if you get this message again.", "invalid_sec_code":"Data Code Error. You did not get the bonus. You should reconnect if you get this message again.",
"item_earned":"You Earned a %ITEM%!", "item_earned":"You Earned a %ITEM%!",
"item_earned_full_inv":"You Earned a %ITEM% but DID NOT have room for it!",
"item_deleted":"You Lost an %ITEM%!", "item_deleted":"You Lost an %ITEM%!",
"money_earned":"You Earned $%MONEY%!", "money_earned":"You Earned $%MONEY%!",
"highscore_beaten":"You just beat your best score! New high score: %SCORE%.", "highscore_beaten":"You just beat your best score! New high score: %SCORE%.",

View file

@ -12,6 +12,45 @@ namespace HISP.Game.Horse
public class WildHorse public class WildHorse
{ {
public bool CanHorseBeHere(int x, int y, bool checkSpawnLocationValid=true)
{
// Horses cannot be in towns.
if (World.InTown(x, y))
return false;
if (World.InSpecialTile(x, y))
return false;
// Check area
if(checkSpawnLocationValid)
{
if (this.Instance.Breed.SpawnInArea != null)
{
if (World.InArea(x, y))
{
if (World.GetArea(x, y).Name != this.Instance.Breed.SpawnInArea)
return false;
}
}
}
// Check Tile Type
int TileID = Map.GetTileId(x, y, false);
string TileType = Map.TerrainTiles[TileID - 1].Type;
if(checkSpawnLocationValid)
{
if (TileType != this.Instance.Breed.SpawnOn)
return false;
}
if (Map.CheckPassable(x, y)) // Can the player stand over here?
return true;
return false;
}
public WildHorse(HorseInstance horse, int MapX = -1, int MapY = -1, int despawnTimeout=60, bool addToDatabase = true) public WildHorse(HorseInstance horse, int MapX = -1, int MapY = -1, int despawnTimeout=60, bool addToDatabase = true)
{ {
Instance = horse; Instance = horse;
@ -24,31 +63,20 @@ namespace HISP.Game.Horse
if (horse.Breed.SpawnInArea == null) if (horse.Breed.SpawnInArea == null)
{ {
// Pick a random isle.
int isleId = GameServer.RandomNumberGenerator.Next(0, World.Isles.Count);
World.Isle isle = World.Isles[isleId];
// Pick x/y in isle. // Pick x/y
int tryX = GameServer.RandomNumberGenerator.Next(isle.StartX, isle.EndX); int tryX = GameServer.RandomNumberGenerator.Next(0, Map.Width);
int tryY = GameServer.RandomNumberGenerator.Next(isle.StartY, isle.EndY); int tryY = GameServer.RandomNumberGenerator.Next(0, Map.Height);
// Horses cannot be in towns. if (CanHorseBeHere(tryX, tryY))
if (World.InTown(tryX, tryY))
continue;
if (World.InSpecialTile(tryX, tryY))
continue;
// Check Tile Type
int TileID = Map.GetTileId(tryX, tryY, false);
string TileType = Map.TerrainTiles[TileID - 1].Type;
if (TileType == horse.Breed.SpawnOn)
{ {
if (Map.CheckPassable(tryX, tryY)) // Can the player stand over here? x = tryX;
{ y = tryY;
x = tryX; break;
y = tryY; }
break; else
} {
continue;
} }
} }
else else
@ -58,23 +86,15 @@ namespace HISP.Game.Horse
int tryX = GameServer.RandomNumberGenerator.Next(zone.StartX, zone.EndX); int tryX = GameServer.RandomNumberGenerator.Next(zone.StartX, zone.EndX);
int tryY = GameServer.RandomNumberGenerator.Next(zone.StartY, zone.EndY); int tryY = GameServer.RandomNumberGenerator.Next(zone.StartY, zone.EndY);
// Horses cannot be in towns. if (CanHorseBeHere(tryX, tryY))
if (World.InTown(tryX, tryY))
continue;
if (World.InSpecialTile(tryX, tryY))
continue;
// Check Tile Type
int TileID = Map.GetTileId(tryX, tryY, false);
string TileType = Map.TerrainTiles[TileID - 1].Type;
if (TileType == horse.Breed.SpawnOn)
{ {
if (Map.CheckPassable(tryX, tryY)) // Can the player stand over here? x = tryX;
{ y = tryY;
x = tryX; break;
y = tryY; }
break; else
} {
continue;
} }
} }
@ -93,42 +113,38 @@ namespace HISP.Game.Horse
public void RandomWander() public void RandomWander()
{ {
while(true) if (GameServer.GetUsersAt(this.X, this.Y, true, true).Length > 0)
return;
int direction = GameServer.RandomNumberGenerator.Next(0, 3);
int tryX = this.X;
int tryY = this.Y;
switch (direction)
{ {
int direction = GameServer.RandomNumberGenerator.Next(0, 3); case 0:
int tryX = this.X; tryX += 1;
int tryY = this.Y;
switch (direction)
{
case 0:
tryX += 1;
break;
case 1:
tryX -= 1;
break;
case 2:
tryY += 1;
break;
case 3:
tryY -= 1;
break;
}
// Horses cannot be in towns.
if (World.InTown(tryX, tryY))
continue;
if (World.InSpecialTile(tryX, tryY))
continue;
if (Map.CheckPassable(tryX, tryY)) // Can the player stand here?
{
X = tryX;
Y = tryY;
break; break;
} case 1:
tryX -= 1;
break;
case 2:
tryY += 1;
break;
case 3:
tryY -= 1;
break;
} }
bool check = CanHorseBeHere(this.X, this.Y); // if the horse is allready in an invalid position..
if (CanHorseBeHere(tryX, tryY, check))
{
x = tryX;
y = tryY;
}
} }
public void Escape() public void Escape()
@ -138,13 +154,9 @@ namespace HISP.Game.Horse
int tryX = X + GameServer.RandomNumberGenerator.Next(-15, 15); int tryX = X + GameServer.RandomNumberGenerator.Next(-15, 15);
int tryY = Y + GameServer.RandomNumberGenerator.Next(-15, 15); int tryY = Y + GameServer.RandomNumberGenerator.Next(-15, 15);
// Horses cannot be in towns. bool check = CanHorseBeHere(this.X, this.Y); // if the horse is allready in an invalid position..
if (World.InTown(tryX, tryY))
continue;
if (World.InSpecialTile(tryX, tryY))
continue;
if (Map.CheckPassable(tryX, tryY)) if (CanHorseBeHere(tryX, tryY, check))
{ {
X = tryX; X = tryX;
Y = tryY; Y = tryY;

View file

@ -65,6 +65,9 @@ namespace HISP.Game.Inventory
public void AddInfinity(Item.ItemInformation itemInfo) public void AddInfinity(Item.ItemInformation itemInfo)
{ {
if (HasItemId(itemInfo.Id))
return;
InventoryItem inventoryItem = new InventoryItem(); InventoryItem inventoryItem = new InventoryItem();
inventoryItem.ItemId = itemInfo.Id; inventoryItem.ItemId = itemInfo.Id;
inventoryItem.Infinite = true; inventoryItem.Infinite = true;

View file

@ -451,6 +451,7 @@ namespace HISP.Game
// Sec Codes // Sec Codes
public static string InvalidSecCodeError; public static string InvalidSecCodeError;
public static string YouEarnedAnItemFormat; public static string YouEarnedAnItemFormat;
public static string YouEarnedAnItemButInventoryWasFullFormat;
public static string YouLostAnItemFormat; public static string YouLostAnItemFormat;
public static string YouEarnedMoneyFormat; public static string YouEarnedMoneyFormat;
public static string BeatHighscoreFormat; public static string BeatHighscoreFormat;
@ -1245,6 +1246,10 @@ namespace HISP.Game
{ {
return YouLostAnItemFormat.Replace("%ITEM%", itemName); return YouLostAnItemFormat.Replace("%ITEM%", itemName);
} }
public static string FormatYouEarnedAnItemButInventoryFullMessage(string itemName)
{
return YouEarnedAnItemButInventoryWasFullFormat.Replace("%ITEM%", itemName);
}
public static string FormatYouEarnedAnItemMessage(string itemName) public static string FormatYouEarnedAnItemMessage(string itemName)
{ {
return YouEarnedAnItemFormat.Replace("%ITEM%", itemName); return YouEarnedAnItemFormat.Replace("%ITEM%", itemName);

View file

@ -181,12 +181,12 @@ namespace HISP.Game
// Give quest points // Give quest points
user.QuestPoints += quest.QuestPointsEarned; user.QuestPoints += quest.QuestPointsEarned;
if (quest.ChainedQuestId != 0)
ActivateQuest(user, GetQuestById(quest.ChainedQuestId));
if (quest.Tracked) if (quest.Tracked)
user.Quests.TrackQuest(quest.Id); user.Quests.TrackQuest(quest.Id);
if (quest.ChainedQuestId != 0)
ActivateQuest(user, Quest.GetQuestById(quest.ChainedQuestId), npcActivation);
if (quest.SuccessMessage != null) if (quest.SuccessMessage != null)
{ {
@ -205,6 +205,7 @@ namespace HISP.Game
// Check if award unlocked // Check if award unlocked
int questPointsPercent = Convert.ToInt32(Math.Floor(((decimal)user.QuestPoints / (decimal)GetTotalQuestPoints()) * (decimal)100.0)); int questPointsPercent = Convert.ToInt32(Math.Floor(((decimal)user.QuestPoints / (decimal)GetTotalQuestPoints()) * (decimal)100.0));
if (questPointsPercent >= 25) if (questPointsPercent >= 25)

View file

@ -137,7 +137,7 @@ namespace HISP.Server
private bool receivePackets() private bool receivePackets()
{ {
// HI1 Packets are terminates by 0x00 so we have to read until we receive that terminator // HI1 Packets are terminates by 0x00 so we have to read until we receive that terminator
MemoryStream ms = new MemoryStream();
while(ClientSocket.Connected) while(ClientSocket.Connected)
{ {
@ -146,29 +146,29 @@ namespace HISP.Server
try try
{ {
if (ClientSocket.Available >= 1) using (MemoryStream ms = new MemoryStream())
{ {
byte[] buffer = new byte[ClientSocket.Available]; if (ClientSocket.Available >= 1)
ClientSocket.Receive(buffer);
foreach (Byte b in buffer)
{ {
if(isDisconnecting) byte[] buffer = new byte[ClientSocket.Available];
break; ClientSocket.Receive(buffer);
ms.WriteByte(b); foreach (Byte b in buffer)
if (b == 0x00)
{ {
ms.Seek(0x00, SeekOrigin.Begin); if (isDisconnecting)
byte[] fullPacket = ms.ToArray(); break;
parsePackets(fullPacket);
ms.Close(); ms.WriteByte(b);
ms = new MemoryStream(); if (b == 0x00)
{
ms.Seek(0x00, SeekOrigin.Begin);
byte[] fullPacket = ms.ToArray();
parsePackets(fullPacket);
ms.Seek(0x00, SeekOrigin.Begin);
ms.SetLength(0);
}
} }
} }
} }
} }
catch(SocketException e) catch(SocketException e)

View file

@ -1064,6 +1064,7 @@ namespace HISP.Server
Messages.InvalidSecCodeError = gameData.messages.sec_code.invalid_sec_code; Messages.InvalidSecCodeError = gameData.messages.sec_code.invalid_sec_code;
Messages.YouEarnedAnItemFormat = gameData.messages.sec_code.item_earned; Messages.YouEarnedAnItemFormat = gameData.messages.sec_code.item_earned;
Messages.YouEarnedAnItemButInventoryWasFullFormat = gameData.messages.sec_code.item_earned_full_inv;
Messages.YouLostAnItemFormat = gameData.messages.sec_code.item_deleted; Messages.YouLostAnItemFormat = gameData.messages.sec_code.item_deleted;
Messages.YouEarnedMoneyFormat = gameData.messages.sec_code.money_earned; Messages.YouEarnedMoneyFormat = gameData.messages.sec_code.money_earned;
Messages.BeatHighscoreFormat = gameData.messages.sec_code.highscore_beaten; Messages.BeatHighscoreFormat = gameData.messages.sec_code.highscore_beaten;

View file

@ -2296,9 +2296,19 @@ namespace HISP.Server
if (Item.ItemIdExist(value)) if (Item.ItemIdExist(value))
{ {
ItemInstance itm = new ItemInstance(value); ItemInstance itm = new ItemInstance(value);
sender.LoggedinUser.Inventory.Add(itm);
Item.ItemInformation itemInfo = Item.GetItemById(value); Item.ItemInformation itemInfo = Item.GetItemById(value);
byte[] earnedItemMessage = PacketBuilder.CreateChat(Messages.FormatYouEarnedAnItemMessage(itemInfo.Name), PacketBuilder.CHAT_BOTTOM_RIGHT); string messageToSend = Messages.FormatYouEarnedAnItemMessage(itemInfo.Name);
try
{
sender.LoggedinUser.Inventory.Add(itm);
}
catch(InventoryException)
{
messageToSend = Messages.FormatYouEarnedAnItemButInventoryFullMessage(itemInfo.Name);
}
byte[] earnedItemMessage = PacketBuilder.CreateChat(messageToSend, PacketBuilder.CHAT_BOTTOM_RIGHT);
sender.SendPacket(earnedItemMessage); sender.SendPacket(earnedItemMessage);
} }
else else