Files
Server/src/engine/objects/Kit.java
T

156 lines
5.4 KiB
Java
Raw Normal View History

2026-10-25 08:44:13 -04:00
2026-07-26 19:08:44 -04:00
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2026
// https://www.magicbane.com
2022-04-30 09:41:17 -04:00
package engine.objects;
import engine.gameManager.DbManager;
import engine.mbEnums;
2026-10-25 08:44:13 -04:00
import engine.mbEnums.EquipSlotType;
import engine.mbEnums.ItemContainerType;
import engine.mbEnums.OwnerType;
2026-10-25 08:44:13 -04:00
import engine.parsers.objects.ItemTemplate;
import engine.parsers.objects.RuneTemplate;
import engine.parsers.objects.wpak.StartingKitTemplate;
2022-04-30 09:41:17 -04:00
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
2026-10-25 08:44:13 -04:00
import java.util.EnumMap;
2022-04-30 09:41:17 -04:00
import java.util.HashMap;
2026-10-25 08:44:13 -04:00
import java.util.Map;
2022-04-30 09:41:17 -04:00
public class Kit extends AbstractGameObject {
2023-07-15 09:23:48 -04:00
public static HashMap<Integer, Boolean> NoobGearIDS = new HashMap<>();
2026-10-25 08:44:13 -04:00
// Keyed like the client's kit map (0x620250): race name, sex and class name, not rune ids
private static final HashMap<String, ArrayList<Kit>> _kitsByRaceClass = new HashMap<>();
2023-07-15 09:23:48 -04:00
private final byte kitNumber;
2026-10-25 08:44:13 -04:00
private final EnumMap<EquipSlotType, Integer> items = new EnumMap<>(EquipSlotType.class);
2022-04-30 09:41:17 -04:00
2026-10-25 08:44:13 -04:00
public Kit(StartingKitTemplate template) {
2023-07-15 09:23:48 -04:00
super();
2022-04-30 09:41:17 -04:00
2026-10-25 08:44:13 -04:00
int itemID;
ItemTemplate itemTemplate;
EquipSlotType slot;
this.kitNumber = (byte) template.kit_number;
// The cfg lists the off-hand column before the weapon; fill from the end so the weapon takes RHELD
for (int i = template.item_ids.size() - 1; i >= 0; i--) {
itemID = template.item_ids.get(i);
Kit.NoobGearIDS.put(itemID, true);
itemTemplate = ItemTemplate._items.get(itemID);
if (itemTemplate == null) {
Logger.warn("Kit " + kitKey(template.race, template.sex.name(), template.base_class) + " #" + this.kitNumber
+ ": no item template " + itemID);
continue;
}
slot = freeSlot(itemTemplate);
if (slot == null) {
Logger.warn("Kit " + kitKey(template.race, template.sex.name(), template.base_class) + " #" + this.kitNumber
+ ": no free slot for item " + itemID);
continue;
}
this.items.put(slot, itemID);
}
2023-07-15 09:23:48 -04:00
}
2022-04-30 09:41:17 -04:00
2026-10-25 08:44:13 -04:00
public static void LoadAllKits() {
Kit kit;
String key;
for (StartingKitTemplate template : StartingKitTemplate._kits) {
kit = new Kit(template);
key = kitKey(template.race, template.sex.name(), template.base_class);
_kitsByRaceClass.computeIfAbsent(key, k -> new ArrayList<>()).add(kit);
2023-07-15 09:23:48 -04:00
}
2022-04-30 09:41:17 -04:00
2026-10-25 08:44:13 -04:00
Logger.info("Loaded " + StartingKitTemplate._kits.size() + " kits for " + _kitsByRaceClass.size() + " race/sex/class");
}
2022-04-30 09:41:17 -04:00
2026-10-25 08:44:13 -04:00
public static Kit getKit(int raceRuneID, int baseClassRuneID, int kitNumber) {
RuneTemplate raceRune = RuneTemplate._runes.get(raceRuneID);
RuneTemplate classRune = RuneTemplate._runes.get(baseClassRuneID);
mbEnums.RaceType raceType = mbEnums.RaceType.getRaceTypebyRuneID(raceRuneID);
ArrayList<Kit> kits;
if (raceRune == null || classRune == null || raceType == null)
return null;
kits = _kitsByRaceClass.get(kitKey(raceRune.obj_name, raceType.getCharacterSex().name(), classRune.obj_name));
if (kits == null || kitNumber < 0 || kitNumber >= kits.size())
return null;
return kits.get(kitNumber);
2023-07-15 09:23:48 -04:00
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
public static boolean IsNoobGear(int itemID) {
2022-04-30 09:41:17 -04:00
return Kit.NoobGearIDS.containsKey(itemID);
}
2026-10-25 08:44:13 -04:00
private static String kitKey(String race, String sex, String baseClass) {
return race + " " + sex + " " + baseClass;
}
2022-04-30 09:41:17 -04:00
private static boolean kitItemCreator(PlayerCharacter pc, int templateID, mbEnums.EquipSlotType slot) {
2022-04-30 09:41:17 -04:00
2024-03-22 12:28:58 -04:00
Item item = new Item(templateID);
2024-03-02 11:07:07 -05:00
item.ownerID = pc.getObjectUUID();
item.ownerType = OwnerType.PlayerCharacter;
item.containerType = ItemContainerType.EQUIPPED;
2024-03-08 12:19:57 -05:00
item.equipSlot = slot;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
try {
2024-03-02 11:07:07 -05:00
item = DbManager.ItemQueries.PERSIST(item);
2023-07-15 09:23:48 -04:00
} catch (Exception e) {
Logger.error(e);
}
2022-04-30 09:41:17 -04:00
2024-03-02 11:07:07 -05:00
if (item == null) {
2023-07-15 09:23:48 -04:00
Logger.info("Ungoof this goof, something is wrong with our kit.");
}
return true;
}
2022-04-30 09:41:17 -04:00
2026-10-25 08:44:13 -04:00
private EquipSlotType freeSlot(ItemTemplate itemTemplate) {
2022-04-30 09:41:17 -04:00
2026-10-25 08:44:13 -04:00
for (EquipSlotType slot : itemTemplate.item_eq_slots_or)
if (!this.items.containsKey(slot))
return slot;
2022-04-30 09:41:17 -04:00
2026-10-25 08:44:13 -04:00
return null;
2023-07-15 09:23:48 -04:00
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
public byte getKitNumber() {
return kitNumber;
}
public void equipPCwithKit(PlayerCharacter pc) {
2026-10-25 08:44:13 -04:00
for (Map.Entry<EquipSlotType, Integer> entry : this.items.entrySet())
kitItemCreator(pc, entry.getValue(), entry.getKey());
2023-07-15 09:23:48 -04:00
}
@Override
public void updateDatabase() {
// TODO Create update logic.
}
2022-04-30 09:41:17 -04:00
}