use of de.sanandrew.mods.claysoldiers.api.soldier.upgrade.ISoldierUpgrade in project ClaySoldiersMod by SanAndreasP.
the class EntityClaySoldier method addUpgrade.
@Override
public ISoldierUpgradeInst addUpgrade(ISoldierUpgrade upgrade, EnumUpgradeType type, @Nonnull ItemStack stack) {
if (upgrade == null) {
return null;
}
ISoldierUpgradeInst upgInst = new SoldierUpgrade(upgrade, type, stack.copy().splitStack(1));
this.addUpgradeInternal(upgInst);
upgrade.onAdded(this, stack, upgInst);
this.callUpgradeFunc(EnumUpgFunctions.ON_UPGRADE_ADDED, upgInstCl -> upgInstCl.getUpgrade().onUpgradeAdded(this, upgInstCl, upgInst));
if (upgrade.syncData() && !this.world.isRemote) {
this.sendSyncUpgrades(true, new UpgradeEntry(upgrade, type));
}
return upgInst;
}
use of de.sanandrew.mods.claysoldiers.api.soldier.upgrade.ISoldierUpgrade in project ClaySoldiersMod by SanAndreasP.
the class UpgradeRegistry method registerUpgrade.
@Override
public boolean registerUpgrade(UUID id, ISoldierUpgrade upgrade) {
if (id == null || upgrade == null) {
CsmConstants.LOG.log(Level.WARN, String.format("Upgrade ID and instance cannot be null nor empty for ID %s!", id));
return false;
}
ItemStack[] upgItems = upgrade.getStacks();
if (upgItems.length < 1 || Arrays.stream(upgItems).anyMatch(itm -> !ItemStackUtils.isValid(itm))) {
CsmConstants.LOG.log(Level.WARN, String.format("Upgrade items are invalid for ID %s!", id));
return false;
}
if (this.idToUpgradeMap.containsKey(id)) {
CsmConstants.LOG.log(Level.WARN, String.format("Duplicate Upgrade ID %s!", id));
return false;
}
if (this.upgradeToIdMap.containsKey(upgrade)) {
CsmConstants.LOG.log(Level.WARN, String.format("Duplicate Upgrade instances for %s!", id));
return false;
}
for (ItemStack existingItm : this.stackToUpgradeMap.keySet()) {
if (Arrays.stream(upgItems).anyMatch(itm -> ItemStackUtils.areEqualNbtFit(itm, existingItm, false, existingItm.getItemDamage() != OreDictionary.WILDCARD_VALUE))) {
CsmConstants.LOG.log(Level.WARN, String.format("Duplicate Upgrade Item %s for ID %s!", existingItm, id));
return false;
}
}
this.idToUpgradeMap.put(id, upgrade);
this.upgradeToIdMap.put(upgrade, id);
Arrays.stream(upgItems).forEach(stk -> stackToUpgradeMap.put(stk.copy(), upgrade));
this.upgrades.add(upgrade);
return true;
}
use of de.sanandrew.mods.claysoldiers.api.soldier.upgrade.ISoldierUpgrade in project ClaySoldiersMod by SanAndreasP.
the class EntityClaySoldier method readEntityFromNBT.
@Override
public void readEntityFromNBT(NBTTagCompound compound) {
super.readEntityFromNBT(compound);
String teamId = compound.getString(NBTConstants.E_SOLDIER_TEAM);
this.dataManager.set(TEAM_PARAM, UuidUtils.isStringUuid(teamId) ? UUID.fromString(teamId) : UuidUtils.EMPTY_UUID);
this.dataManager.set(TEXTURE_TYPE_PARAM, compound.getByte(NBTConstants.E_SOLDIER_TEXTYPE));
this.dataManager.set(TEXTURE_ID_PARAM, compound.getByte(NBTConstants.E_SOLDIER_TEXID));
if (compound.hasKey(NBTConstants.E_SOLDIER_DOLL, Constants.NBT.TAG_COMPOUND)) {
this.doll = new ItemStack(compound.getCompoundTag(NBTConstants.E_SOLDIER_DOLL));
}
NBTTagList upgrades = compound.getTagList(NBTConstants.E_SOLDIER_UPGRADES, Constants.NBT.TAG_COMPOUND);
for (int i = 0, max = upgrades.tagCount(); i < max; i++) {
NBTTagCompound upgNbt = upgrades.getCompoundTagAt(i);
String idStr = upgNbt.getString(NBTConstants.N_UPGRADE_ID);
byte type = upgNbt.getByte(NBTConstants.N_UPGRADE_TYPE);
if (UuidUtils.isStringUuid(idStr)) {
ItemStack upgStack = new ItemStack(upgNbt.getCompoundTag(NBTConstants.N_UPGRADE_ITEM));
ISoldierUpgrade upgrade = UpgradeRegistry.INSTANCE.getUpgrade(UUID.fromString(idStr));
if (upgrade != null) {
ISoldierUpgradeInst upgInst = new SoldierUpgrade(upgrade, EnumUpgradeType.VALUES[type], upgStack);
upgInst.setNbtData(upgNbt.getCompoundTag(NBTConstants.N_UPGRADE_NBT));
upgrade.onLoad(this, upgInst, upgNbt);
this.addUpgradeInternal(upgInst);
}
}
}
NBTTagList effects = compound.getTagList(NBTConstants.E_SOLDIER_EFFECTS, Constants.NBT.TAG_COMPOUND);
for (int i = 0, max = effects.tagCount(); i < max; i++) {
NBTTagCompound effectNbt = effects.getCompoundTagAt(i);
String idStr = effectNbt.getString(NBTConstants.N_EFFECT_ID);
if (UuidUtils.isStringUuid(idStr)) {
ISoldierEffect effect = EffectRegistry.INSTANCE.getEffect(UUID.fromString(idStr));
if (effect != null) {
ISoldierEffectInst effInst = new SoldierEffect(effect, effectNbt.getInteger(NBTConstants.N_EFFECT_DURATION));
effInst.setNbtData(effectNbt.getCompoundTag(NBTConstants.N_EFFECT_NBT));
effect.onLoad(this, effInst, effectNbt);
this.addEffectInternal(effInst);
}
}
}
this.dwBooleans.readFromNbt(compound);
}
use of de.sanandrew.mods.claysoldiers.api.soldier.upgrade.ISoldierUpgrade in project ClaySoldiersMod by SanAndreasP.
the class EntityClaySoldier method pickupUpgrade.
public void pickupUpgrade(EntityItem item) {
ItemStack stack = item.getItem();
if (stack.getCount() < 1) {
return;
}
ISoldierUpgrade upg = UpgradeRegistry.INSTANCE.getUpgrade(stack);
if (upg == null || this.hasUpgrade(upg, upg.getType(this))) {
return;
}
ISoldierUpgradeInst upgInst = this.addUpgrade(upg, upg.getType(this), stack);
if (upgInst != null) {
if (Arrays.asList(UpgradeRegistry.getFuncCalls(upg)).contains(EnumUpgFunctions.ON_PICKUP)) {
upg.onPickup(this, item, upgInst);
}
}
}
use of de.sanandrew.mods.claysoldiers.api.soldier.upgrade.ISoldierUpgrade in project ClaySoldiersMod by SanAndreasP.
the class EntityClaySoldier method addUpgradeInternal.
private void addUpgradeInternal(ISoldierUpgradeInst instance) {
ISoldierUpgrade upgrade = instance.getUpgrade();
UpgradeEntry entry = new UpgradeEntry(upgrade, upgrade.getType(this));
this.upgradeMap.put(entry, instance);
if (upgrade.syncData()) {
this.upgradeSyncList.add(instance);
}
Arrays.asList(UpgradeRegistry.getFuncCalls(upgrade)).forEach(func -> {
Queue<ISoldierUpgradeInst> upgList = this.upgradeFuncMap.get(func).computeIfAbsent(upgrade.getPriority(), k -> new ConcurrentLinkedQueue<>());
upgList.add(instance);
});
switch(upgrade.getType(this)) {
case MAIN_HAND:
this.setMainhandUpg(true);
break;
case OFF_HAND:
this.setOffhandUpg(true);
break;
case BEHAVIOR:
this.setBehaviorUpg(true);
break;
}
}
Aggregations