package com.austinv11.peripheralsplusplus.turtles.peripherals;
import com.austinv11.peripheralsplusplus.entities.EntityRidableTurtle;
import com.austinv11.peripheralsplusplus.network.RidableTurtlePacket;
import com.austinv11.peripheralsplusplus.reference.Config;
import com.austinv11.peripheralsplusplus.turtles.TurtleRidable;
import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.turtle.ITurtleAccess;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.player.EntityPlayer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PeripheralRidable extends MountedPeripheral {
private final ITurtleAccess turtle;
public PeripheralRidable(ITurtleAccess turtle) {
this.turtle = turtle;
}
@Override
public String getType() {
return "ridable";
}
@Override
public String[] getMethodNames() {
return new String[]{"getEntity", "mountNearbyEntity", "unmount", "up"};
}
@Override
public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException {
if (!Config.enableRidableTurtle)
throw new LuaException("Ridable turtles have been disabled.");
switch (method) {
case 0:
return getRidingEntity();
case 1:
return mountNearbyEntity();
case 2:
return unmount();
case 3:
return up();
}
return new Object[0];
}
private Object[] up() {
boolean success;
try {
EntityRidableTurtle ridableTurtleEntity = TurtleRidable.getEntity(turtle);
success = ridableTurtleEntity.canMoveUp();
ridableTurtleEntity.queueAction(RidableTurtlePacket.MovementCode.ASCEND.code);
} catch (Exception ignore) {
return new Object[]{false};
}
return new Object[]{success};
}
private Object[] unmount() {
try {
EntityRidableTurtle ridableTurtleEntity = TurtleRidable.getEntity(turtle);
ridableTurtleEntity.riddenByEntity.mountEntity(null);
} catch (Exception e) {
return new Object[]{false};
}
return new Object[]{true};
}
private Object[] mountNearbyEntity() {
List entities = TurtleRidable.getNearbyEntities(turtle, 1, 2, Entity.class);
Entity entity = null;
for (Object ent : entities) {
if (((Entity)ent).isEntityAlive() && !(ent instanceof EntityRidableTurtle)) {
entity = (Entity) ent;
break;
}
}
try {
EntityRidableTurtle ridableTurtleEntity = TurtleRidable.getEntity(turtle);
if (entity == null || ridableTurtleEntity.riddenByEntity != null)
return new Object[]{false};
entity.mountEntity(ridableTurtleEntity);
} catch (Exception e) {
return new Object[]{false};
}
return new Object[]{true};
}
private Object[] getRidingEntity() {
EntityRidableTurtle ridableTurtleEntity;
try {
ridableTurtleEntity = TurtleRidable.getEntity(turtle);
} catch (Exception e) {
return new Object[0];
}
Entity ridingEntity = ridableTurtleEntity.riddenByEntity;
Map<String, Object> map = new HashMap<String, Object>();
if (ridingEntity != null) {
map.put("name", ridingEntity instanceof EntityPlayer ? ((EntityPlayer) ridingEntity).getDisplayName() :
EntityList.getEntityString(ridingEntity));
map.put("type", ridingEntity.getClass().getSimpleName());
map.put("uuid", ridingEntity instanceof EntityPlayer ?
((EntityPlayer) ridingEntity).getGameProfile().getId().toString() : ridingEntity.getUniqueID().toString());
}
return new Object[]{map};
}
@Override
public boolean equals(IPeripheral other) {
return other == this;
}
}