package shootergame.entity.player; import shootergame.Main; import shootergame.cheats.Cheats; import shootergame.display.Camera; import shootergame.entity.Entity; import shootergame.entity.EntityAlive; import shootergame.entity.EntityBullet; import shootergame.entity.EntityInventory; import shootergame.entity.EntityItem; import shootergame.entity.EntityVertical; import shootergame.init.Items; import shootergame.init.Textures; import shootergame.inventory.Inventory; import shootergame.util.gl.GlHelpers; import shootergame.util.gl.texture.TextureReference; import shootergame.util.math.ItemStack; import shootergame.util.math.MathHelpers; import shootergame.util.math.vec.Vec2d; import shootergame.util.math.vec.Vec2i; import shootergame.world.chunk.Chunk; import shootergame.world.layer.Layer; public class EntityPlayer extends EntityVertical implements EntityAlive, EntityInventory { public boolean MOVE_FORWARD = false; public boolean MOVE_BACKWARD = false; public boolean MOVE_LEFT = false; public boolean MOVE_RIGHT = false; public boolean GUN = false; public boolean moving = false; public double height = 0; private int bullet_frequency = 0; private double health_max = 1000; private double health = health_max; public boolean dead = false; public boolean in_animation = false; private Inventory inventory; public int inventory_hand = 0; public int ammo = 1000; public int defence_level = 0; public int gun_level = 0; private static final Vec2d size = new Vec2d(1, 1); public EntityPlayer() { super(TextureReference.EMPTY, size); this.angle = 45; // Set some settings hitbox = 0.5; isSolid = true; goThroughSolid = false; crossUnWalkable = false; emitsLight = true; inventory = new Inventory(6); } @Override public double getLightLevel() { return 1; } @Override public void tick(Chunk chunk, Layer layer) { // Handle player deaths if(health <= 0) { if(Cheats.god_mode) { this.resetHealth(); } else { dead = true; health = 0; } } // Is the player dead or in an animation if(dead || in_animation) return; // Call super super.tick(chunk, layer); // Rotate left if(MOVE_LEFT) { this.angle -= 1; this.angle = MathHelpers.mod(this.angle, 360); } // Rotate right if(MOVE_RIGHT) { this.angle += 1; this.angle = MathHelpers.mod(this.angle, 360); } // Move forward if(MOVE_FORWARD) { this.moveForward(); } // Move backward if(MOVE_BACKWARD) { this.moveBackward(); } // Use the gun if(GUN) { this.fireBullet(0); } } @Override public void kill() { // Is god mode inactive; kill the player if(!Cheats.god_mode) { dead = true; } } @Override public void moveTowards(double angle, double speed) { if(dead || in_animation) return; super.moveTowards(angle, speed); } @Override public void moveForward() { this.moveForward(0.08); } @Override public void moveBackward(double speed) { super.moveBackward(0.08); } @Override public void render(Vec2d pos, Camera camera) { // Don't render if the player is dead if(dead) return; // Translation GlHelpers.pushMatrix(); GlHelpers.translate(0, 0, height); // Set the colour due to the lighting double light = chunk.getLightLevel(new Vec2i( MathHelpers.floor(pos.x), MathHelpers.floor(pos.y))); GlHelpers.color3(light, light, light); // Moving if(MOVE_BACKWARD || MOVE_FORWARD || moving) super.render(pos, camera, Textures.ENTITY_PLAYER_MOVING, size); // Standing still else super.render(pos, camera, Textures.ENTITY_PLAYER_STILL, size); // Pop the matrix GlHelpers.popMatrix(); } public void fireBullet(double angle) { if(dead || in_animation) return; bullet_frequency += 1; bullet_frequency %= 10; // Is there enough ammo and are the bullets at the right frequency if(bullet_frequency == 0 && ammo > 0) { // Remove some ammo ammo -= 1; // Summon bullets at this angle relative to the player int d = (int)(1 + gun_level / 4.0); int b = (int)(1 + gun_level / 4.0); Main.world.getLayer().spawnEntity(new EntityBullet(pos.copy(), this, angle + this.angle, 20*d*d, 5/b)); } } public void activateItem() { if(dead || in_animation) return; ItemStack is = inventory.getItem(inventory_hand); if(!is.isEmpty()) { is.item.onAction(is, Main.world.getLayer(), chunk, this); } } @Override public void addHealth(double amount) { health += amount; if(health > health_max) health = health_max; } @Override public void removeHealth(double amount) { amount = amount / (defence_level / 2.5 + 1); health -= amount; } @Override public double getHealth() { return health; } @Override public void resetHealth() { health = health_max; } @Override public void clearHealth() { health = 0; } @Override public double maxHealth() { return health_max; } @Override public void setHealth(double health) { this.health = health; } @Override public Inventory getInventory() { return inventory; } public void dropItem() { ItemStack i = inventory.getItem(inventory_hand); if(!i.isEmpty()) { Entity e = new EntityItem(pos.copy(), new ItemStack(i.item, 1, i.meta)); e.angle = angle; Main.world.getLayer().spawnEntity(e); i.count -= 1; } } @Override public void push(double amount, double angle) { } @Override public int bloodParticles() { return 5; } }