mana
Diffstat (limited to 'scripts/miningai.js')
| -rw-r--r-- | scripts/miningai.js | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/scripts/miningai.js b/scripts/miningai.js new file mode 100644 index 0000000..7be1f2b --- /dev/null +++ b/scripts/miningai.js @@ -0,0 +1,106 @@ +let MiningAI = extend(AIController, { + // author: xeloboyo + mining: true, + targetItem: null, + ore: null, + unitS(u) { + if (this.unit == u) return; + this.unit = u; + this.init(); + }, + updateMovement() { + let unit = this.unit; + + var core = unit.closestCore(); //core is a Building + + if (!(unit.canMine()) || core == null) return; + + if (unit.mineTile != null && !unit.mineTile.within(unit, unit.type.range)) { + unit.mineTile = null; + } + + if (this.mining) { + if (this.timer.get(1, 240) || this.targetItem == null) { + // let mineItems = unit.team.data().mineItems; + let mineItems = Seq.with(Items.copper, Items.lead, Items.coal, Items.titanium, Items.thorium); + + this.targetItem = mineItems.min(boolf(i => Vars.indexer.hasOre(i) && unit.canMine(i)), floatf(i => core.items.get(i) - orePriority(i))); + + + } + + //core full of the target item, do nothing + if (this.targetItem != null && core.acceptStack(this.targetItem, 1, unit) == 0) { + unit.clearItem(); + unit.mineTile = null; + return; + } + //custom player mining ai: todo + //if inventory is full, drop it off. + if (unit.stack.amount >= unit.type.itemCapacity || (this.targetItem != null && !unit.acceptsItem(this.targetItem))) { + this.mining = false; + } else { + if (this.targetItem != null) { + this.ore = Vars.indexer.findClosestOre(core.x, core.y, this.targetItem); + } + + if (this.ore != null) { + this.moveTo(this.ore, unit.type.range / 5, 20); + + if (unit.within(this.ore, unit.type.range * 0.5)) { + unit.mineTile = this.ore; + } + + if (this.ore.block() != Blocks.air) { + this.mining = false; + } + } + } + } else { + unit.mineTile = null; + + if (unit.stack.amount == 0) { + this.mining = true; + this.return; + } + + if (unit.within(core, unit.type.range)) { + if (core.acceptStack(unit.stack.item, unit.stack.amount, unit) > 0) { + Call.transferInventory(Vars.player, core); + //Call.transferItemTo(unit, unit.stack.item, unit.stack.amount, unit.x, unit.y, core); + } + + //unit.clearItem(); + this.mining = true; + } + // + this.circle(core, unit.type.range / 1.8); + } + } +}); + +function orePriority(item) { + if (item == Items.copper) { + return 900; + } + if (item == Items.lead) { + return 850; + } + if (item == Items.sand) { + return 600; + } + if (item == Items.coal) { + return 200; + } + if (item == Items.titanium) { + return 100; + } + if (item == Items.thorium) { + return 0; + } + return 0; +} + +module.exports = { + playerMiningAI: MiningAI +}
\ No newline at end of file |