Implement workshops and fix more quest weirdnes.

This commit is contained in:
SilicaAndPina 2021-02-06 17:04:50 +13:00
parent cb00f79d48
commit d5762c3b07
9 changed files with 352 additions and 112 deletions

View file

@ -560,11 +560,11 @@ namespace HISP.Server
craftableItem.GiveItemId = gameData.workshop[i].craftable_items[ii].give_item;
craftableItem.MoneyCost = gameData.workshop[i].craftable_items[ii].money_cost;
int totalItemsRequired = gameData.workshop[i].craftable_items[ii].required_items.Count;
for(int iii = 0; iii < 0; iii++)
for(int iii = 0; iii < totalItemsRequired; iii++)
{
Workshop.RequiredItem requiredItem = new Workshop.RequiredItem();
requiredItem.RequiredItemId = totalItemsRequired = gameData.workshop[i].craftable_items[ii].required_items[iii].req_item;
requiredItem.RequiredItemId = totalItemsRequired = gameData.workshop[i].craftable_items[ii].required_items[iii].req_quantity;
requiredItem.RequiredItemId = gameData.workshop[i].craftable_items[ii].required_items[iii].req_item;
requiredItem.RequiredItemCount = gameData.workshop[i].craftable_items[ii].required_items[iii].req_quantity;
craftableItem.RequiredItems.Add(requiredItem);
}
wkShop.CraftableItems.Add(craftableItem);
@ -761,6 +761,17 @@ namespace HISP.Server
Messages.BankDepositedMoneyFormat = gameData.messages.bank.deposit_format;
Messages.BankWithdrewMoneyFormat = gameData.messages.bank.withdraw_format;
// Workshop
Messages.WorkshopCraftEntryFormat = gameData.messages.meta.workshop.craft_entry;
Messages.WorkshopRequiresFormat = gameData.messages.meta.workshop.requires;
Messages.WorkshopRequireEntryFormat = gameData.messages.meta.workshop.require;
Messages.WorkshopAnd = gameData.messages.meta.workshop.and;
Messages.WorkshopNoRoomInInventory = gameData.messages.meta.workshop.no_room;
Messages.WorkshopMissingRequiredItem = gameData.messages.meta.workshop.missing_item;
Messages.WorkshopCraftingSuccess = gameData.messages.meta.workshop.craft_success;
Messages.WorkshopCannotAfford = gameData.messages.meta.workshop.no_money;
// Horses
Messages.AdvancedStatFormat = gameData.messages.meta.horse.stat_format;
Messages.BasicStatFormat = gameData.messages.meta.horse.basic_stat_format;

View file

@ -3390,6 +3390,75 @@ namespace HISP.Server
byte[] ChatPacket = PacketBuilder.CreateChat(Messages.BinocularsNothing, PacketBuilder.CHAT_BOTTOM_RIGHT);
sender.SendPacket(ChatPacket);
}
break;
case PacketBuilder.ITEM_CRAFT:
packetStr = Encoding.UTF8.GetString(packet);
string craftIdStr = packetStr.Substring(2, packet.Length - 2);
int craftId = 0;
// Prevent crashing on non-int string.
try
{
craftId = Int32.Parse(craftIdStr);
}
catch (FormatException)
{
Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to craft using craft id NaN.");
return;
}
if(Workshop.CraftIdExists(craftId))
{
Workshop.CraftableItem itm = Workshop.GetCraftId(craftId);
if(itm.MoneyCost <= sender.LoggedinUser.Money) // Check money
{
foreach(Workshop.RequiredItem reqItem in itm.RequiredItems)
{
if (sender.LoggedinUser.Inventory.HasItemId(reqItem.RequiredItemId))
{
if (sender.LoggedinUser.Inventory.GetItemByItemId(reqItem.RequiredItemId).ItemInstances.Count < reqItem.RequiredItemCount)
goto failMissingItem;
}
else
goto failMissingItem;
}
// Finally create the items
try
{
sender.LoggedinUser.Inventory.Add(new ItemInstance(itm.GiveItemId));
}
catch(InventoryException)
{
byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.WorkshopNoRoomInInventory, PacketBuilder.CHAT_BOTTOM_RIGHT);
sender.SendPacket(inventoryFullMessage);
break;
}
sender.LoggedinUser.Money -= itm.MoneyCost;
// Remove the required items..
foreach(Workshop.RequiredItem reqItem in itm.RequiredItems)
for(int i = 0; i < reqItem.RequiredItemCount; i++)
sender.LoggedinUser.Inventory.Remove(sender.LoggedinUser.Inventory.GetItemByItemId(reqItem.RequiredItemId).ItemInstances[0]);
byte[] itemCraftSuccess = PacketBuilder.CreateChat(Messages.WorkshopCraftingSuccess, PacketBuilder.CHAT_BOTTOM_RIGHT);
sender.SendPacket(itemCraftSuccess);
break;
}
else
{
byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.WorkshopCannotAfford, PacketBuilder.CHAT_BOTTOM_RIGHT);
sender.SendPacket(cantAffordMessage);
break;
}
failMissingItem:
{
byte[] missingItemMessage = PacketBuilder.CreateChat(Messages.WorkshopMissingRequiredItem, PacketBuilder.CHAT_BOTTOM_RIGHT);
sender.SendPacket(missingItemMessage);
break;
}
}
break;
case PacketBuilder.ITEM_SELL: // Handles selling an item.
int totalSold = 1;

View file

@ -137,6 +137,7 @@ namespace HISP.Server
public const byte ITEM_DRINK = 0x52;
public const byte ITEM_BINOCULARS = 0x5C;
public const byte ITEM_MAGNIFYING = 0x5D;
public const byte ITEM_CRAFT = 0x64;
public const byte ITEM_RAKE = 0x5B;
public const byte ITEM_SHOVEL = 0x5A;