diff --git a/build.gradle b/build.gradle index 3e9b05e..9d2880b 100644 --- a/build.gradle +++ b/build.gradle @@ -50,8 +50,8 @@ project(":desktop") { compile "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-desktop" compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" compile "com.google.guava:guava:23.5-jre" + compile "org.apache.commons:commons-compress:1.20" compile "net.nikr:dds:1.0.0" - implementation 'com.github.inwc3:wc3libs:-SNAPSHOT' compile files(fileTree(dir:'../jars', includes: ['*.jar'])) } @@ -68,8 +68,8 @@ project(":core") { compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" compile "com.google.guava:guava:23.5-jre" + compile "org.apache.commons:commons-compress:1.20" compile "net.nikr:dds:1.0.0" - implementation 'com.github.inwc3:wc3libs:-SNAPSHOT' compile files(fileTree(dir:'../jars', includes: ['*.jar'])) } diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/War3MapViewer.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/War3MapViewer.java index 898c871..df90328 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/War3MapViewer.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/War3MapViewer.java @@ -769,6 +769,12 @@ public class War3MapViewer extends AbstractMdxModelViewer { } + @Override + public void spawnSpellEffectOnUnit(CUnit unit, War3ID alias) { + AbilityUI abilityUI = abilityDataUI.getUI(alias); + spawnEffectOnUnit(unit, abilityUI.getTargetArt(0)); + } + @Override public void spawnUnitReadySound(final CUnit trainedUnit) { final RenderUnit renderPeer = War3MapViewer.this.unitToRenderPeer.get(trainedUnit); diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/rendersim/RenderItem.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/rendersim/RenderItem.java index bff055d..c16d9da 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/rendersim/RenderItem.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/rendersim/RenderItem.java @@ -137,7 +137,7 @@ public class RenderItem implements RenderWidget { this.location[2] = this.simulationItem.getFlyHeight() + groundHeight; this.instance.moveTo(this.location); - if (this.shadow != null) { + if (this.shadow != null && !hidden) { this.shadow.move(dx, dy, map.terrain.centerOffset); this.shadow.setHeightAbsolute(currentWalkableUnder != null, groundHeight + map.imageWalkableZOffset); } diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CSimulation.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CSimulation.java index 0a14fbe..012e30a 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CSimulation.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CSimulation.java @@ -153,6 +153,7 @@ public class CSimulation implements CPlayerAPI { } this.commandErrorListener = commandErrorListener; + currentGameDayTimeElapsed = gameplayConstants.getGameDayLength()/2; } @@ -243,6 +244,10 @@ public class CSimulation implements CPlayerAPI { this.handleIdToAbility.put(ability.getHandleId(), ability); } + protected void onAbilityRemovedFromUnit(final CUnit unit, final CAbility ability) { + this.handleIdToAbility.remove(ability.getHandleId()); + } + public CAttackProjectile createProjectile(final CUnit source, final float launchX, final float launchY, final float launchFacing, final CUnitAttackMissile attack, final AbilityTarget target, final float damage, final int bounceIndex, final CUnitAttackListener attackListener) { @@ -472,6 +477,10 @@ public class CSimulation implements CPlayerAPI { this.simulationRenderController.spawnEffectOnUnit(unit, effectPath); } + public void createSpellEffectOnUnit(CUnit unit, War3ID alias) { + simulationRenderController.spawnSpellEffectOnUnit(unit, alias); + } + public void unitSoundEffectEvent(final CUnit caster, final War3ID alias) { this.simulationRenderController.spawnAbilitySoundEffect(caster, alias); } @@ -497,7 +506,12 @@ public class CSimulation implements CPlayerAPI { getPlayer(cUnit.getPlayerIndex()).onHeroDeath(); } - private static final class TimeOfDayVariableEvent extends VariableEvent { + public void removeItem(CItem cItem) { + cItem.setHidden(true); // TODO fix + cItem.setLife(this, 0); + } + + private static final class TimeOfDayVariableEvent extends VariableEvent { private final GlobalScope globalScope; public TimeOfDayVariableEvent(final Trigger trigger, final CLimitOp limitOp, final double doubleValue, diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CUnit.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CUnit.java index 6289ecf..0d782a7 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CUnit.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CUnit.java @@ -187,6 +187,12 @@ public class CUnit extends CWidget { ability.onAdd(simulation, this); } + public void remove(CSimulation simulation, CAbility ability) { + this.abilities.remove(ability); + simulation.onAbilityRemovedFromUnit(this, ability); + ability.onRemove(simulation, this); + } + public War3ID getTypeId() { return this.typeId; } @@ -1133,6 +1139,10 @@ public class CUnit extends CWidget { return this.acquisitionRange; } + public void heal(CSimulation game, int lifeToRegain) { + setLife(game, Math.min(getLife() + lifeToRegain, getMaximumLife())); + } + private static final class AutoAttackTargetFinderEnum implements CUnitEnumFunction { private CSimulation game; private CUnit source; diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/inventory/CAbilityInventory.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/inventory/CAbilityInventory.java index 08da64d..ee25ec7 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/inventory/CAbilityInventory.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/inventory/CAbilityInventory.java @@ -6,7 +6,9 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CItemType; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CSimulation; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnit; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CWidget; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbility; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.AbstractGenericNoIconAbility; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericSingleIconActiveAbility; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityPointTarget; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityTarget; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.behaviors.CBehavior; @@ -16,12 +18,16 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.orders.OrderIds; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.util.AbilityActivationReceiver; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.util.AbilityTargetCheckReceiver; +import java.util.ArrayList; +import java.util.List; + public class CAbilityInventory extends AbstractGenericNoIconAbility { private final boolean canDropItems; private final boolean canGetItems; private final boolean canUseItems; private final boolean dropItemsOnDeath; private final CItem[] itemsHeld; + private final List[] itemsHeldAbilities; private CBehaviorGetItem behaviorGetItem; private CBehaviorDropItem behaviorDropItem; @@ -34,6 +40,10 @@ public class CAbilityInventory extends AbstractGenericNoIconAbility { this.canUseItems = canUseItems; this.dropItemsOnDeath = dropItemsOnDeath; this.itemsHeld = new CItem[itemCapacity]; + this.itemsHeldAbilities = new List[itemCapacity]; + for(int i = 0 ;i < itemsHeldAbilities.length; i++) { + itemsHeldAbilities[i] = new ArrayList<>(); + } } @Override @@ -59,12 +69,22 @@ public class CAbilityInventory extends AbstractGenericNoIconAbility { for (int i = 0; i < this.itemsHeld.length; i++) { if (this.itemsHeld[i] == target) { final CItem temp = this.itemsHeld[i]; + List swapList = itemsHeldAbilities[i]; final int dragDropDestinationIndex = orderId - OrderIds.itemdrag00; this.itemsHeld[i] = this.itemsHeld[dragDropDestinationIndex]; + itemsHeldAbilities[i] = itemsHeldAbilities[dragDropDestinationIndex]; this.itemsHeld[dragDropDestinationIndex] = temp; + itemsHeldAbilities[dragDropDestinationIndex] = swapList; return false; } } + } else if (orderId >= OrderIds.itemuse00 && orderId <= OrderIds.itemuse05) { + CAbility cAbility = itemsHeldAbilities[orderId - OrderIds.itemuse00].get(0); + int forwardedOrderId = orderId; + if(cAbility instanceof GenericSingleIconActiveAbility) { + forwardedOrderId = ((GenericSingleIconActiveAbility)cAbility).getBaseOrderId(); + } + cAbility.checkBeforeQueue(game, caster, forwardedOrderId, target); } return super.checkBeforeQueue(game, caster, orderId, target); } @@ -74,6 +94,8 @@ public class CAbilityInventory extends AbstractGenericNoIconAbility { } + + public int getItemCapacity() { return this.itemsHeld.length; } @@ -108,8 +130,14 @@ public class CAbilityInventory extends AbstractGenericNoIconAbility { @Override public CBehavior beginNoTarget(final CSimulation game, final CUnit caster, final int orderId) { - // TODO Auto-generated method stub - return null; + int slot = orderId - OrderIds.itemuse00; + CBehavior behavior = itemsHeldAbilities[slot].get(0).beginNoTarget(game, caster, orderId); + CItem cItem = itemsHeld[slot]; + if(cItem.getItemType().isPerishable()) { + dropItem(game, caster, slot, caster.getX(), caster.getY(), false); + game.removeItem(cItem); + } + return behavior; } @Override @@ -169,13 +197,26 @@ public class CAbilityInventory extends AbstractGenericNoIconAbility { @Override public void checkCanTargetNoTarget(final CSimulation game, final CUnit unit, final int orderId, final AbilityTargetCheckReceiver receiver) { - receiver.orderIdNotAccepted(); + if(orderId >= OrderIds.itemuse00 && orderId <= OrderIds.itemuse05) { + receiver.targetOk(null); + } else { + receiver.orderIdNotAccepted(); + } } @Override protected void innerCheckCanUse(final CSimulation game, final CUnit unit, final int orderId, final AbilityActivationReceiver receiver) { - receiver.useOk(); + if(orderId >= OrderIds.itemuse00 && orderId <= OrderIds.itemuse05){ + int slot = orderId - OrderIds.itemuse00; + if(itemsHeldAbilities[slot].size() < 1) { + receiver.notAnActiveAbility(); + } else { + itemsHeldAbilities[slot].get(0).checkCanUse(game, unit, orderId, receiver); + } + } else { + receiver.useOk(); + } } /** @@ -200,6 +241,12 @@ public class CAbilityInventory extends AbstractGenericNoIconAbility { if (this.itemsHeld[i] == null) { this.itemsHeld[i] = item; item.setHidden(true); + for(War3ID abilityId: item.getItemType().getAbilityList()) { + CAbility abilityFromItem = simulation.getAbilityData().getAbilityType(abilityId).createAbility(simulation.getHandleIdAllocator().createId()); + abilityFromItem.setIconShowing(false); + hero.add(simulation, abilityFromItem); + itemsHeldAbilities[i].add(abilityFromItem); + } hero.onPickUpItem(simulation, item, true); return i; } @@ -215,8 +262,11 @@ public class CAbilityInventory extends AbstractGenericNoIconAbility { public void dropItem(final CSimulation simulation, final CUnit hero, final int slotIndex, final float x, final float y, final boolean playUserUISounds) { final CItem droppedItem = this.itemsHeld[slotIndex]; - hero.onDropItem(simulation, droppedItem, true); + hero.onDropItem(simulation, droppedItem, playUserUISounds); this.itemsHeld[slotIndex] = null; + for(CAbility ability: itemsHeldAbilities[slotIndex]) { + hero.remove(simulation, ability); + } droppedItem.setHidden(false); droppedItem.setPointAndCheckUnstuck(x, y, simulation); } @@ -224,15 +274,20 @@ public class CAbilityInventory extends AbstractGenericNoIconAbility { public void dropItem(final CSimulation simulation, final CUnit hero, final CItem itemToDrop, final float x, final float y, final boolean playUserUISounds) { boolean foundItem = false; + int index = -1; for (int i = 0; i < this.itemsHeld.length; i++) { if (this.itemsHeld[i] == itemToDrop) { this.itemsHeld[i] = null; + index = i; foundItem = true; } } if (foundItem) { - hero.onDropItem(simulation, itemToDrop, true); + hero.onDropItem(simulation, itemToDrop, playUserUISounds); itemToDrop.setHidden(false); + for(CAbility ability: itemsHeldAbilities[index]) { + hero.remove(simulation, ability); + } itemToDrop.setPointAndCheckUnstuck(x, y, simulation); } } diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/item/CAbilityItemHeal.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/item/CAbilityItemHeal.java new file mode 100644 index 0000000..e5ff52a --- /dev/null +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/item/CAbilityItemHeal.java @@ -0,0 +1,101 @@ +package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.item; + +import com.etheller.warsmash.util.War3ID; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CSimulation; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnit; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CWidget; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.AbstractGenericSingleIconNoSmartActiveAbility; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityPointTarget; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityTarget; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.behaviors.CBehavior; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.orders.OrderIds; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.util.AbilityActivationReceiver; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.util.AbilityTargetCheckReceiver; + +public class CAbilityItemHeal extends AbstractGenericSingleIconNoSmartActiveAbility { + private final int lifeToRegain; + + public CAbilityItemHeal(int handleId, War3ID alias, int lifeToRegain) { + super(handleId, alias); + this.lifeToRegain = lifeToRegain; + } + + @Override + protected void innerCheckCanTarget(CSimulation game, CUnit unit, int orderId, CWidget target, AbilityTargetCheckReceiver receiver) { + receiver.orderIdNotAccepted(); + } + + @Override + protected void innerCheckCanTarget(CSimulation game, CUnit unit, int orderId, AbilityPointTarget target, AbilityTargetCheckReceiver receiver) { + receiver.orderIdNotAccepted(); + } + + @Override + protected void innerCheckCanTargetNoTarget(CSimulation game, CUnit unit, int orderId, AbilityTargetCheckReceiver receiver) { + if(orderId == getBaseOrderId()) { + receiver.targetOk(null); + } else { + receiver.orderIdNotAccepted(); + } + } + + @Override + protected void innerCheckCanUse(CSimulation game, CUnit unit, int orderId, AbilityActivationReceiver receiver) { + receiver.useOk(); + } + + @Override + public int getBaseOrderId() { + return OrderIds.heal; + } + + @Override + public boolean isToggleOn() { + return false; + } + + @Override + public void onAdd(CSimulation game, CUnit unit) { + + } + + @Override + public void onRemove(CSimulation game, CUnit unit) { + + } + + @Override + public void onTick(CSimulation game, CUnit unit) { + + } + + @Override + public void onCancelFromQueue(CSimulation game, CUnit unit, int orderId) { + + } + + @Override + public boolean checkBeforeQueue(CSimulation game, CUnit caster, int orderId, AbilityTarget target) { + if(target == null && orderId == getBaseOrderId()) { + caster.heal(game, lifeToRegain); + game.createSpellEffectOnUnit(caster, getAlias()); + return false; + } + return super.checkBeforeQueue(game, caster, orderId, target); + } + + @Override + public CBehavior begin(CSimulation game, CUnit caster, int orderId, CWidget target) { + return null; + } + + @Override + public CBehavior begin(CSimulation game, CUnit caster, int orderId, AbilityPointTarget point) { + return null; + } + + @Override + public CBehavior beginNoTarget(CSimulation game, CUnit caster, int orderId) { + return null; + } +} diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/definitions/impl/CAbilityTypeDefinitionItemHeal.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/definitions/impl/CAbilityTypeDefinitionItemHeal.java new file mode 100644 index 0000000..a7bd398 --- /dev/null +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/definitions/impl/CAbilityTypeDefinitionItemHeal.java @@ -0,0 +1,34 @@ +package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl; + +import com.etheller.warsmash.units.manager.MutableObjectData.MutableGameObject; +import com.etheller.warsmash.util.War3ID; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.CAbilityType; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.CAbilityTypeDefinition; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl.CAbilityTypeChannelTest; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl.CAbilityTypeItemHeal; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl.CAbilityTypeItemHealLevelData; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CTargetType; + +import java.util.EnumSet; +import java.util.List; + +public class CAbilityTypeDefinitionItemHeal extends AbstractCAbilityTypeDefinition + implements CAbilityTypeDefinition { + protected static final War3ID HIT_POINTS_GAINED = War3ID.fromString("Ihpg"); + + @Override + protected CAbilityTypeItemHealLevelData createLevelData(final MutableGameObject abilityEditorData, + final int level) { + final String targetsAllowedAtLevelString = abilityEditorData.getFieldAsString(TARGETS_ALLOWED, level); + final int hitPointsGained = abilityEditorData.getFieldAsInteger(HIT_POINTS_GAINED, level); + final EnumSet targetsAllowedAtLevel = CTargetType.parseTargetTypeSet(targetsAllowedAtLevelString); + return new CAbilityTypeItemHealLevelData(targetsAllowedAtLevel, hitPointsGained); + } + + @Override + protected CAbilityType innerCreateAbilityType(final War3ID alias, final MutableGameObject abilityEditorData, + final List levelData) { + return new CAbilityTypeItemHeal(alias, abilityEditorData.getCode(), levelData); + } + +} diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeItemHeal.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeItemHeal.java new file mode 100644 index 0000000..ec0ac83 --- /dev/null +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeItemHeal.java @@ -0,0 +1,24 @@ +package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl; + +import com.etheller.warsmash.util.War3ID; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbility; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.item.CAbilityItemHeal; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.test.CAbilityChannelTest; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.CAbilityType; + +import java.util.List; + +public class CAbilityTypeItemHeal extends CAbilityType { + + public CAbilityTypeItemHeal(final War3ID alias, final War3ID code, + final List levelData) { + super(alias, code, levelData); + } + + @Override + public CAbility createAbility(final int handleId) { + final CAbilityTypeItemHealLevelData levelData = getLevelData(0); + return new CAbilityItemHeal(handleId, getAlias(), levelData.getLifeToRegain()); + } + +} diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeItemHealLevelData.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeItemHealLevelData.java new file mode 100644 index 0000000..ad205b7 --- /dev/null +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeItemHealLevelData.java @@ -0,0 +1,19 @@ +package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl; + +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.CAbilityTypeLevelData; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CTargetType; + +import java.util.EnumSet; + +public class CAbilityTypeItemHealLevelData extends CAbilityTypeLevelData { + private final int lifeToRegain; + + public CAbilityTypeItemHealLevelData(final EnumSet targetsAllowed, final int lifeToRegain) { + super(targetsAllowed); + this.lifeToRegain = lifeToRegain; + } + + public int getLifeToRegain() { + return lifeToRegain; + } +} diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CAbilityData.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CAbilityData.java index 1158268..91b8e55 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CAbilityData.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CAbilityData.java @@ -42,6 +42,7 @@ public class CAbilityData { this.codeToAbilityTypeDefinition.put(War3ID.fromString("Arep"), new CAbilityTypeDefinitionHumanRepair()); this.codeToAbilityTypeDefinition.put(War3ID.fromString("Avul"), new CAbilityTypeDefinitionInvulnerable()); this.codeToAbilityTypeDefinition.put(War3ID.fromString("Acoi"), new CAbilityTypeDefinitionCoupleInstant()); + this.codeToAbilityTypeDefinition.put(War3ID.fromString("AIhe"), new CAbilityTypeDefinitionItemHeal()); } public CAbilityType getAbilityType(final War3ID alias) { diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/util/SimulationRenderController.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/util/SimulationRenderController.java index e38a1f9..74a668a 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/util/SimulationRenderController.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/util/SimulationRenderController.java @@ -52,6 +52,8 @@ public interface SimulationRenderController { void spawnEffectOnUnit(CUnit unit, String effectPath); + void spawnSpellEffectOnUnit(CUnit unit, War3ID alias); + void spawnUIUnitGetItemSound(CUnit cUnit, CItem item); void spawnUIUnitDropItemSound(CUnit cUnit, CItem item); @@ -61,4 +63,5 @@ public interface SimulationRenderController { void unitPreferredSelectionReplacement(CUnit unit, CUnit newUnit); void heroRevived(CUnit trainedUnit); + } diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/ui/MeleeUI.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/ui/MeleeUI.java index 9e09850..5c45378 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/ui/MeleeUI.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/ui/MeleeUI.java @@ -91,19 +91,8 @@ import com.etheller.warsmash.viewer5.handlers.w3x.rendersim.ability.IconUI; import com.etheller.warsmash.viewer5.handlers.w3x.rendersim.ability.ItemUI; import com.etheller.warsmash.viewer5.handlers.w3x.rendersim.ability.UnitIconUI; import com.etheller.warsmash.viewer5.handlers.w3x.rendersim.commandbuttons.CommandButtonListener; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CDestructable; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CGameplayConstants; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CItem; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CItemType; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CPlayerStateListener; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnit; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.*; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnit.QueueItemType; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnitClassification; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnitEnumFunction; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnitStateListener; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnitType; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CWidget; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CWidgetFilterFunction; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbility; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbilityAttack; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbilityGeneric; @@ -2299,7 +2288,7 @@ public class MeleeUI implements CUnitStateListener, CommandButtonListener, Comma } this.recycleStringBuilder.append(uberTip); inventoryIcon.setCommandButtonData(iconUI.getIcon(), 0, - activelyUsed ? itemType.getCooldownGroup().getValue() : 0, index + 1, activelyUsed, + activelyUsed ? (OrderIds.itemuse00+index) : 0, index + 1, activelyUsed, false, false, itemUI.getName(), this.recycleStringBuilder.toString(), itemType.getGoldCost(), itemType.getLumberCost(), 0); } @@ -3155,9 +3144,9 @@ public class MeleeUI implements CUnitStateListener, CommandButtonListener, Comma private class ItemCommandCardCommandListener implements CommandCardCommandListener { @Override public void onClick(final int abilityHandleId, final int orderId, final boolean rightClick) { + final RenderUnit selectedUnit2 = MeleeUI.this.selectedUnit; + final CUnit simulationUnit = selectedUnit2.getSimulationUnit(); if (rightClick) { - final RenderUnit selectedUnit2 = MeleeUI.this.selectedUnit; - final CUnit simulationUnit = selectedUnit2.getSimulationUnit(); final CAbilityInventory inventoryData = simulationUnit.getInventoryData(); final int slot = orderId - 1; final CItem itemInSlot = inventoryData.getItemInSlot(slot); @@ -3177,6 +3166,19 @@ public class MeleeUI implements CUnitStateListener, CommandButtonListener, Comma MeleeUI.this.activeCommandUnit = selectedUnit2; } } + } else { + CSimulation game = war3MapViewer.simulation; + BooleanAbilityActivationReceiver receiver = BooleanAbilityActivationReceiver.INSTANCE; + CAbilityInventory inventoryData = simulationUnit.getInventoryData(); + inventoryData.checkCanUse(game, simulationUnit, orderId, receiver); + if(receiver.isOk()) { + BooleanAbilityTargetCheckReceiver targetReceiver = BooleanAbilityTargetCheckReceiver.getInstance(); + targetReceiver.reset(); + inventoryData.checkCanTargetNoTarget(game, simulationUnit, orderId, targetReceiver); + if(targetReceiver.isTargetable()) { + MeleeUI.this.unitOrderListener.issueImmediateOrder(simulationUnit.getHandleId(), inventoryData.getHandleId(), orderId, isShiftDown()); + } + } } } diff --git a/core/src/com/hiveworkshop/rms/parsers/mdlx/util/MdxUtils.java b/core/src/com/hiveworkshop/rms/parsers/mdlx/util/MdxUtils.java index 514d43e..db031f5 100644 --- a/core/src/com/hiveworkshop/rms/parsers/mdlx/util/MdxUtils.java +++ b/core/src/com/hiveworkshop/rms/parsers/mdlx/util/MdxUtils.java @@ -13,7 +13,6 @@ import com.hiveworkshop.rms.parsers.mdlx.MdlxModel; public class MdxUtils { public static MdlxModel loadMdlx(final InputStream inputStream) throws IOException { - return new MdlxModel(ByteBuffer.wrap(IOUtils.toByteArray(inputStream))); } diff --git a/desktop/src/com/etheller/warsmash/desktop/DesktopLauncher.java b/desktop/src/com/etheller/warsmash/desktop/DesktopLauncher.java index 7f28931..1ba74fc 100644 --- a/desktop/src/com/etheller/warsmash/desktop/DesktopLauncher.java +++ b/desktop/src/com/etheller/warsmash/desktop/DesktopLauncher.java @@ -4,10 +4,9 @@ import static org.lwjgl.openal.AL10.AL_ORIENTATION; import static org.lwjgl.openal.AL10.AL_POSITION; import static org.lwjgl.openal.AL10.alListener; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; +import java.io.*; import java.nio.FloatBuffer; +import java.util.Date; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; @@ -38,6 +37,17 @@ import com.etheller.warsmash.viewer5.gl.WireframeExtension; public class DesktopLauncher { public static void main(final String[] arg) { + new File("Logs").mkdir(); + try { + System.setOut(new PrintStream(new FileOutputStream(new File("Logs/"+System.currentTimeMillis()+".out.log")))); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + try { + System.setErr(new PrintStream(new FileOutputStream(new File("Logs/"+System.currentTimeMillis()+".err.log")))); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } final LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); config.useGL30 = true; config.gles30ContextMajorVersion = 3;