package net.fourbytes.shadow.entities;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.IntMap;
import net.fourbytes.shadow.*;
import net.fourbytes.shadow.Input.TouchPoint;
import net.fourbytes.shadow.Input.TouchPoint.TouchMode;
import net.fourbytes.shadow.blocks.BlockType;
import net.fourbytes.shadow.map.MapObject;
import net.fourbytes.shadow.map.ShadowMap;
import net.fourbytes.shadow.network.ClientLevel;
import net.fourbytes.shadow.network.DataMapUpdate;
import net.fourbytes.shadow.network.ServerLevel;
import net.fourbytes.shadow.systems.IParticleManager;
import net.fourbytes.shadow.systems.ITimeDaySystem;
import net.fourbytes.shadow.utils.Garbage;
public class Cursor extends Entity {
public int id = -1;
public boolean render = false;
public Color color;
public int layerid = 0;
public int playerln = Byte.MIN_VALUE;
//public static Array<Particle> pps = new Array<Particle>(Particle.class);
public Cursor(Vector2 position, Layer layer) {
this(position, layer, -1);
}
public Cursor(Vector2 position, Layer layer, int id) {
super(position, layer);
this.id = id;
solid = false;
color = new Color(1f, 1f, 1f, 0.5f);
}
@Override
public TextureRegion getTexture(int id) {
return Images.getTextureRegion("white");
}
public int button;
@Override
public void tick(float delta) {
if (playerln == Byte.MIN_VALUE) {
for (IntMap.Entry<Layer> entry : layer.level.layers.entries()) {
int ln = entry.key;
Layer ll = entry.value;
if (ll.entities.contains(layer.level.player, true)) {
playerln = ln;
break;
}
}
}
layer.level.fillLayer(playerln + layerid);
layer = layer.level.layers.get(playerln + layerid);
TouchPoint tp = Input.touches.get(id);
if (tp != null && tp.touchmode == TouchMode.Cursor) {
pos.set(calcPos(tp.pos));
oldpos = tp.pos;
button = tp.button;
switch (tp.button) {
case -1: amb(tp, true); break;
case 0: lmb(tp, true); break;
case 1: rmb(tp, true); break;
case 2: mmb(tp, true); break;
}
render = true;
} else {
downtick = 0;
switch (button) {
case -1: amb(tp, false); break;
case 0: lmb(tp, false); break;
case 1: rmb(tp, false); break;
case 2: mmb(tp, false); break;
}
}
if (tp == null && id != -1) {
layer.level.cursors.removeValue(this, true);
}
if (oldpos != null && id == -1) {
pos.set(calcPos(oldpos));
}
scroll(0);
}
int downtick = 0;
boolean amb = false;
int amode = 0;
boolean lmb = false;
boolean rmb = false;
boolean mmb = false;
public void amb(TouchPoint point, boolean isDown) {
downtick++;
if (isDown && !amb) {
amode = 0;
}
if (amode == 0) {
Array<Block> blocks = layer.get(Coord.get(pos.x, pos.y));
if (blocks != null && blocks.size > 0) {
amode = 2;
} else {
amode = 1;
}
}
if (isDown && amb) {
switch (amode) {
case 0: break;
case 1: lmb(point, true); break;
case 2: rmb(point, true); break;
default: break;
}
}
amb = isDown;
}
public void lmb(TouchPoint point, boolean isDown) {
downtick++;
if (isDown && (!lmb || downtick > 20)) {
Block b = BlockType.getInstance("BlockPush", pos.x, pos.y, layer);
b.layer.add(b);
if (layer.level instanceof ClientLevel || layer.level instanceof ServerLevel) {
DataMapUpdate dmu = new DataMapUpdate();
dmu.object = ShadowMap.convert(b);
dmu.mode = DataMapUpdate.MapUpdateModes.ADD;
if (layer.level instanceof ClientLevel) {
Shadow.client.send(dmu);
} else {
Shadow.server.send(dmu);
}
}
/*for (int i = 0; i < pps.size; i++) {
Particle pp = pps.items[i];
pp.layer.remove(pp);
}
pps.clear();*/
}
lmb = isDown;
}
public void rmb(TouchPoint point, boolean isDown) {
downtick++;
if (isDown && (!rmb || downtick > 20)) {
Array<Block> blocks = layer.get(Coord.get(pos.x, pos.y));
if (blocks != null) {
for (Block b : blocks) {
b.pixelify();
b.layer.remove(b);
}
if (layer.level instanceof ClientLevel || layer.level instanceof ServerLevel) {
DataMapUpdate dmu = new DataMapUpdate();
dmu.object = new MapObject();
dmu.object.x = pos.x;
dmu.object.y = pos.y;
dmu.object.layer = layer.level.layers.findKey(layer, true, Integer.MAX_VALUE);
dmu.mode = DataMapUpdate.MapUpdateModes.REMOVE;
if (layer.level instanceof ClientLevel) {
Shadow.client.send(dmu);
} else {
Shadow.server.send(dmu);
}
}
}
//Entity e = new MobTest(new Vector2(pos), layer);
//e.layer.add(e);
/*
Vector2 pos = Garbage.vec2s.getNext();
pos.set(point.pos);
float cx = Shadow.cam.camrec.x;
float cy = Shadow.cam.camrec.y;
float mx = (pos.x * (Shadow.vieww/Shadow.dispw)) * Shadow.cam.cam.zoom;
float my = (pos.y * (Shadow.viewh/Shadow.disph)) * Shadow.cam.cam.zoom;
float tx = mx + cx;
float ty = my + cy;
pos.set(tx, ty);
for (int i = 0; i < pps.size; i++) {
Particle pp = pps.items[i];
float f = pp.pos.dst(pos) / 2f;
if (f >= 1f) {
f = 1f;
}
float m = f;
f *= 0.1f;
m *= 0.5f;
if (m < 0.15f) {
m = 0.15f;
}
pp.movement.x += (pos.x - pp.pos.x) * f;
pp.movement.y += (pos.y - pp.pos.y) * f;
if (pp.movement.x > m) {
pp.movement.x = m;
}
if (pp.movement.y > m) {
pp.movement.y = m;
}
if (pp.movement.x < -m) {
pp.movement.x = -m;
}
if (pp.movement.y < -m) {
pp.movement.y = -m;
}
}
*/
}
rmb = isDown;
}
public void mmb(TouchPoint point, boolean isDown) {
downtick++;
if (isDown && (!mmb || downtick > 20)) {
Vector2 ppos = Garbage.vec2s.getNext();
Color color = Garbage.colors.getNext();
color.set(0.75f, 0.5f, 0.25f, 1f);
for (float dx = 0f; dx <= 1f; dx += MathUtils.random(0.3f, 0.7f)) {
for (float dy = 0f; dy <= 1f; dy += MathUtils.random(0.3f, 0.7f)) {
ppos.set(pos).add(dx, dy);
color.mul(1f + MathUtils.random(-0.2f, 0.2f));
color.a = 1f - MathUtils.random(0.15f);
Particle pp = layer.level.systems.get(IParticleManager.class).create("PixelParticle", ppos, layer.level.player.layer, color, 0.0775f, 0);
//Particle pp = layer.level.particles.create("PixelParticle", ppos, layer.level.player.layer, color, 0.0775f, -1);
//Particle pp = layer.level.particles.create("RainParticle", ppos, layer.level.player.layer, null, 0.0775f, 0);
//pp.objgravity = 0f;
//pp.slowdown = 0f;
//pp.pos.add(rec.width / 2f, rec.height / 2f);
pp.light.set(pp.baseColors[pp.imgIDs[0]]).a = 0.1f;
//pp.solid = true;
pp.layer.add(pp);
//pps.add(pp);
if (layer.level instanceof ClientLevel || layer.level instanceof ServerLevel) {
DataMapUpdate dmu = new DataMapUpdate();
dmu.object = ShadowMap.convert(pp);
dmu.mode = DataMapUpdate.MapUpdateModes.ADD;
if (layer.level instanceof ClientLevel) {
Shadow.client.send(dmu);
} else {
Shadow.server.send(dmu);
}
}
}
}
}
mmb = isDown;
}
Vector2 oldpos = new Vector2();
final static Vector2 ppos = new Vector2();
public Vector2 calcPos(Vector2 apos) {
oldpos.set(apos);
Vector2 pos = ppos;
pos.set(apos);
float g = 1f;
float cx = Shadow.cam.camrec.x;
float cy = Shadow.cam.camrec.y;
float mx = (pos.x * (Shadow.vieww/Shadow.dispw)) * Shadow.cam.cam.zoom;
float my = (pos.y * (Shadow.viewh/Shadow.disph)) * Shadow.cam.cam.zoom;
float tx = mx + cx;
float ty = my + cy;
float otx = tx;
float oty = ty;
tx = (int) (tx / g);
ty = (int) (ty / g);
tx *= g;
ty *= g;
if (otx < 0) {
tx -= g;
}
if (oty < 0) {
ty -= g;
}
pos.set(tx, ty);
return pos;
}
@Override
public void preRender() {
super.preRender();
if (!render) {
images[0].setColor(1f, 1f, 1f, 0f);
alpha = 0f;
} else {
images[0].setColor(color);
alpha = 1f;
}
}
@Override
public void render() {
if (render) {
super.render();
}
}
public void scroll(int amount) {
ITimeDaySystem time = layer.level.systems.get(ITimeDaySystem.class);
if (time != null) {
time.setTime(time.getTime() + amount);
}
}
}