Search in sources :

Example 1 with CollisionBox

use of io.xol.chunkstories.api.physics.CollisionBox in project chunkstories-core by Hugobros3.

the class ItemFirearm method onControllerInput.

@Override
public boolean onControllerInput(Entity user, ItemPile pile, Input input, Controller controller) {
    // Don't do anything with the left mouse click
    if (input.getName().startsWith("mouse.")) {
        return true;
    }
    if (input.getName().equals("shootGun")) {
        if (user instanceof EntityLiving) {
            EntityLiving shooter = (EntityLiving) user;
            // Serverside checks
            // if (user.getWorld() instanceof WorldMaster)
            {
                // Is the reload cooldown done
                if (cooldownEnd > System.currentTimeMillis())
                    return false;
                // Do we have any bullets to shoot
                boolean bulletPresence = (user instanceof EntityCreative && ((EntityCreative) user).isCreativeMode()) || checkBullet(pile);
                if (!bulletPresence) {
                    // Dry.ogg
                    return true;
                } else if (!(user instanceof EntityCreative && ((EntityCreative) user).isCreativeMode())) {
                    consumeBullet(pile);
                }
            }
            // Jerk client view a bit
            if (shooter.getWorld() instanceof WorldClient) {
                EntityComponentRotation rot = ((EntityLiving) user).getEntityRotationComponent();
                rot.applyInpulse(shake * (Math.random() - 0.5) * 3.0, shake * -(Math.random() - 0.25) * 5.0);
            }
            // Play sounds
            if (controller != null) {
                controller.getSoundManager().playSoundEffect(this.soundName, Mode.NORMAL, user.getLocation(), 1.0f, 1.0f, 1.0f, (float) soundRange);
            }
            playAnimation();
            // Raytrace shot
            Vector3d eyeLocation = new Vector3d(shooter.getLocation());
            if (shooter instanceof EntityPlayer)
                eyeLocation.add(new Vector3d(0.0, ((EntityPlayer) shooter).eyePosition, 0.0));
            // For each shot
            for (int ss = 0; ss < shots; ss++) {
                Vector3d direction = new Vector3d(shooter.getDirectionLookingAt());
                direction.add(new Vector3d(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5).normalize().mul(accuracy / 100d));
                direction.normalize();
                // Find wall collision
                Location shotBlock = user.getWorld().collisionsManager().raytraceSolid(eyeLocation, direction, range);
                Vector3dc nearestLocation = null;
                // Loops to try and break blocks
                boolean brokeLastBlock = false;
                while (user.getWorld() instanceof WorldMaster && shotBlock != null) {
                    WorldCell peek = user.getWorld().peekSafely(shotBlock);
                    // int data = peek.getData();
                    Voxel voxel = peek.getVoxel();
                    brokeLastBlock = false;
                    if (!voxel.isAir() && voxel.getMaterial().resolveProperty("bulletBreakable") != null && voxel.getMaterial().resolveProperty("bulletBreakable").equals("true")) {
                        // TODO Spawn an event to check if it's okay
                        // Destroy it
                        peek.setVoxel(voxel.store().air());
                        brokeLastBlock = true;
                        for (int i = 0; i < 25; i++) {
                            Vector3d smashedVoxelParticleDirection = new Vector3d(direction);
                            smashedVoxelParticleDirection.mul(2.0);
                            smashedVoxelParticleDirection.add(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5);
                            smashedVoxelParticleDirection.normalize();
                            user.getWorld().getParticlesManager().spawnParticleAtPositionWithVelocity("voxel_frag", shotBlock, smashedVoxelParticleDirection);
                        }
                        user.getWorld().getSoundManager().playSoundEffect("sounds/environment/glass.ogg", Mode.NORMAL, shotBlock, (float) Math.random() * 0.2f + 0.9f, 1.0f);
                        // Re-raytrace the ray
                        shotBlock = user.getWorld().collisionsManager().raytraceSolid(eyeLocation, direction, range);
                    } else
                        break;
                }
                // Spawn decal and particles on block the bullet embedded itself in
                if (shotBlock != null && !brokeLastBlock) {
                    Location shotBlockOuter = user.getWorld().collisionsManager().raytraceSolidOuter(eyeLocation, direction, range);
                    if (shotBlockOuter != null) {
                        Vector3d normal = shotBlockOuter.sub(shotBlock);
                        double NbyI2x = 2.0 * direction.dot(normal);
                        Vector3d NxNbyI2x = new Vector3d(normal);
                        NxNbyI2x.mul(NbyI2x);
                        Vector3d reflected = new Vector3d(direction);
                        reflected.sub(NxNbyI2x);
                        // Vector3d.sub(direction, NxNbyI2x, reflected);
                        // shotBlock.setX(shotBlock.getX() + 1);
                        WorldCell peek = user.getWorld().peekSafely(shotBlock);
                        for (CollisionBox box : peek.getTranslatedCollisionBoxes()) {
                            Vector3dc thisLocation = box.lineIntersection(eyeLocation, direction);
                            if (thisLocation != null) {
                                if (nearestLocation == null || nearestLocation.distance(eyeLocation) > thisLocation.distance(eyeLocation))
                                    nearestLocation = thisLocation;
                            }
                        }
                        Vector3d particleSpawnPosition = new Vector3d(nearestLocation);
                        // Position adjustements so shot blocks always shoot proper particles
                        if (shotBlock.x() - particleSpawnPosition.x() <= -1.0)
                            particleSpawnPosition.add(-0.01, 0d, 0d);
                        if (shotBlock.y() - particleSpawnPosition.y() <= -1.0)
                            particleSpawnPosition.add(0d, -0.01, 0d);
                        if (shotBlock.z() - particleSpawnPosition.z() <= -1.0)
                            particleSpawnPosition.add(0d, 0d, -0.01);
                        for (int i = 0; i < 25; i++) {
                            Vector3d untouchedReflection = new Vector3d(reflected);
                            Vector3d random = new Vector3d(Math.random() * 2.0 - 1.0, Math.random() * 2.0 - 1.0, Math.random() * 2.0 - 1.0);
                            random.mul(0.5);
                            untouchedReflection.add(random);
                            untouchedReflection.normalize();
                            untouchedReflection.mul(0.25);
                            // Vector3d ppos = new Vector3d(particleSpawnPosition);
                            controller.getParticlesManager().spawnParticleAtPositionWithVelocity("voxel_frag", particleSpawnPosition, untouchedReflection);
                        }
                        controller.getSoundManager().playSoundEffect(peek.getVoxel().getMaterial().resolveProperty("landingSounds"), Mode.NORMAL, particleSpawnPosition, 1, 0.05f);
                        /*double bspeed = 5/60.0 * (1 + Math.random() * 3 * Math.random());
							Vector3d ppos = new Vector3d(reflected);
							ppos.normalize();
							ppos.scale(0.5);
							ppos.add(nearestLocation);
							WorldEffects.createFireball(shooter.getWorld(), ppos, 1f, damage*0.15*bspeed, (float) (0.0 + 0.05*damage));
							*/
                        controller.getDecalsManager().drawDecal(nearestLocation, normal.negate(), new Vector3d(0.5), "bullethole");
                    }
                }
                // Hitreg takes place on server bois
                if (shooter.getWorld() instanceof WorldMaster) {
                    // Iterate over each found entities
                    Iterator<Entity> shotEntities = user.getWorld().collisionsManager().rayTraceEntities(eyeLocation, direction, 256f);
                    while (shotEntities.hasNext()) {
                        Entity shotEntity = shotEntities.next();
                        // Don't shoot itself & only living things get shot
                        if (!shotEntity.equals(shooter) && shotEntity instanceof EntityLiving) {
                            // Get hit location
                            for (HitBox hitBox : ((EntityLiving) shotEntity).getHitBoxes()) {
                                Vector3dc hitPoint = hitBox.lineIntersection(eyeLocation, direction);
                                if (hitPoint == null)
                                    continue;
                                // System.out.println("shot" + hitBox.getName());
                                // Deal damage
                                ((EntityLiving) shotEntity).damage(pileAsDamageCause(pile), hitBox, (float) damage);
                                // Spawn blood particles
                                Vector3d bloodDir = direction.normalize().mul(0.75);
                                for (int i = 0; i < 120; i++) {
                                    Vector3d random = new Vector3d(Math.random() * 2.0 - 1.0, Math.random() * 2.0 - 1.0, Math.random() * 2.0 - 1.0);
                                    random.mul(0.25);
                                    random.add(bloodDir);
                                    shooter.getWorld().getParticlesManager().spawnParticleAtPositionWithVelocity("blood", hitPoint, random);
                                }
                                // Spawn blood on walls
                                if (nearestLocation != null)
                                    shooter.getWorld().getDecalsManager().drawDecal(nearestLocation, bloodDir, new Vector3d(Math.min(3, shots) * damage / 20f), "blood");
                            }
                        }
                    }
                }
            }
            controller.getParticlesManager().spawnParticleAtPosition("muzzle", eyeLocation);
            FirearmShotEvent event = new FirearmShotEvent(this, shooter, controller);
            shooter.getWorld().getGameContext().getPluginManager().fireEvent(event);
            return (shooter.getWorld() instanceof WorldMaster);
        }
    }
    return false;
}
Also used : EntityComponentRotation(io.xol.chunkstories.api.entity.components.EntityComponentRotation) Entity(io.xol.chunkstories.api.entity.Entity) HitBox(io.xol.chunkstories.api.entity.EntityLiving.HitBox) WorldCell(io.xol.chunkstories.api.world.World.WorldCell) EntityLiving(io.xol.chunkstories.api.entity.EntityLiving) EntityCreative(io.xol.chunkstories.api.entity.interfaces.EntityCreative) WorldClient(io.xol.chunkstories.api.world.WorldClient) Vector3dc(org.joml.Vector3dc) Vector3d(org.joml.Vector3d) Voxel(io.xol.chunkstories.api.voxel.Voxel) EntityPlayer(io.xol.chunkstories.core.entity.EntityPlayer) WorldMaster(io.xol.chunkstories.api.world.WorldMaster) Location(io.xol.chunkstories.api.Location) CollisionBox(io.xol.chunkstories.api.physics.CollisionBox)

Example 2 with CollisionBox

use of io.xol.chunkstories.api.physics.CollisionBox in project chunkstories-core by Hugobros3.

the class ItemMeleeWeapon method onControllerInput.

@Override
public boolean onControllerInput(Entity owner, ItemPile pile, Input input, Controller controller) {
    if (input.getName().startsWith("mouse.left")) {
        // Checks current swing is done
        if (System.currentTimeMillis() - currentSwingStart > swingDuration) {
            currentSwingStart = System.currentTimeMillis();
            hasHitYet = false;
        }
        return true;
    } else if (input.getName().equals("shootGun") && owner.getWorld() instanceof WorldMaster) {
        // Actually hits
        EntityLiving shooter = (EntityLiving) owner;
        Vector3dc direction = shooter.getDirectionLookingAt();
        Vector3d eyeLocation = new Vector3d(shooter.getLocation());
        if (shooter instanceof EntityPlayer)
            eyeLocation.add(new Vector3d(0.0, ((EntityPlayer) shooter).eyePosition, 0.0));
        // Find wall collision
        Location shotBlock = owner.getWorld().collisionsManager().raytraceSolid(eyeLocation, direction, range);
        Vector3d nearestLocation = new Vector3d();
        // Loops to try and break blocks
        while (owner.getWorld() instanceof WorldMaster && shotBlock != null) {
            EditableCell peek = owner.getWorld().peekSafely(shotBlock);
            if (!peek.getVoxel().isAir() && peek.getVoxel().getMaterial().resolveProperty("bulletBreakable") != null && peek.getVoxel().getMaterial().resolveProperty("bulletBreakable").equals("true")) {
                // TODO: Spawn an event to check if it's okay
                // Destroy it
                peek.setVoxel(getDefinition().store().parent().voxels().air());
                for (int i = 0; i < 25; i++) {
                    Vector3d smashedVoxelParticleDirection = new Vector3d(direction);
                    smashedVoxelParticleDirection.mul(2.0);
                    smashedVoxelParticleDirection.add(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5);
                    smashedVoxelParticleDirection.normalize();
                    owner.getWorld().getParticlesManager().spawnParticleAtPositionWithVelocity("voxel_frag", shotBlock, smashedVoxelParticleDirection);
                }
                owner.getWorld().getSoundManager().playSoundEffect("sounds/environment/glass.ogg", Mode.NORMAL, shotBlock, (float) Math.random() * 0.2f + 0.9f, 1.0f);
                // Re-raytrace the ray
                shotBlock = owner.getWorld().collisionsManager().raytraceSolid(eyeLocation, direction, range);
            } else
                break;
        }
        if (shotBlock != null) {
            Location shotBlockOuter = owner.getWorld().collisionsManager().raytraceSolidOuter(eyeLocation, direction, range);
            if (shotBlockOuter != null) {
                Vector3d normal = shotBlockOuter.sub(shotBlock);
                double NbyI2x = 2.0 * direction.dot(normal);
                Vector3d NxNbyI2x = new Vector3d(normal);
                NxNbyI2x.mul(NbyI2x);
                Vector3d reflected = new Vector3d(direction);
                reflected.sub(NxNbyI2x);
                CellData peek = owner.getWorld().peekSafely(shotBlock);
                // This seems fine
                for (CollisionBox box : peek.getTranslatedCollisionBoxes()) {
                    Vector3dc thisLocation = box.lineIntersection(eyeLocation, direction);
                    if (thisLocation != null) {
                        if (nearestLocation == null || nearestLocation.distance(eyeLocation) > thisLocation.distance(eyeLocation))
                            nearestLocation.set(thisLocation);
                    }
                }
                // Position adjustements so shot blocks always shoot proper particles
                if (shotBlock.x() - nearestLocation.x() <= -1.0)
                    nearestLocation.add(-0.01, 0.0, 0.0);
                if (shotBlock.y() - nearestLocation.y() <= -1.0)
                    nearestLocation.add(0.0, -0.01, 0.0);
                if (shotBlock.z() - nearestLocation.z() <= -1.0)
                    nearestLocation.add(0.0, 0.0, -0.01);
                for (int i = 0; i < 25; i++) {
                    Vector3d untouchedReflection = new Vector3d(reflected);
                    Vector3d random = new Vector3d(Math.random() * 2.0 - 1.0, Math.random() * 2.0 - 1.0, Math.random() * 2.0 - 1.0);
                    random.mul(0.5);
                    untouchedReflection.add(random);
                    untouchedReflection.normalize();
                    untouchedReflection.mul(0.25);
                    Vector3d ppos = new Vector3d(nearestLocation);
                    owner.getWorld().getParticlesManager().spawnParticleAtPositionWithVelocity("voxel_frag", ppos, untouchedReflection);
                    owner.getWorld().getSoundManager().playSoundEffect(owner.getWorld().peekSafely(shotBlock).getVoxel().getMaterial().resolveProperty("landingSounds"), Mode.NORMAL, ppos, 1, 0.25f);
                }
                owner.getWorld().getDecalsManager().drawDecal(nearestLocation, normal.negate(), new Vector3d(0.5), "bullethole");
            }
        }
        // Hitreg takes place on server bois
        if (shooter.getWorld() instanceof WorldMaster) {
            // Iterate over each found entities
            Iterator<Entity> shotEntities = owner.getWorld().collisionsManager().rayTraceEntities(eyeLocation, direction, range);
            while (shotEntities.hasNext()) {
                Entity shotEntity = shotEntities.next();
                // Don't shoot itself & only living things get shot
                if (!shotEntity.equals(shooter) && shotEntity instanceof EntityLiving) {
                    // Get hit location
                    for (HitBox hitBox : ((EntityLiving) shotEntity).getHitBoxes()) {
                        Vector3dc hitPoint = hitBox.lineIntersection(eyeLocation, direction);
                        if (hitPoint == null)
                            continue;
                        // Deal damage
                        ((EntityLiving) shotEntity).damage(pileAsDamageCause(pile), hitBox, (float) damage);
                        // Spawn blood particles
                        Vector3d bloodDir = new Vector3d();
                        direction.normalize(bloodDir).mul(0.25);
                        for (int i = 0; i < 250; i++) {
                            Vector3d random = new Vector3d(Math.random() * 2.0 - 1.0, Math.random() * 2.0 - 1.0, Math.random() * 2.0 - 1.0);
                            random.mul(0.25);
                            random.add(bloodDir);
                            shooter.getWorld().getParticlesManager().spawnParticleAtPositionWithVelocity("blood", hitPoint, random);
                        }
                        // Spawn blood on walls
                        if (nearestLocation != null)
                            shooter.getWorld().getDecalsManager().drawDecal(nearestLocation, bloodDir, new Vector3d(3.0), "blood");
                    }
                }
            }
        }
    }
    return false;
}
Also used : Vector3dc(org.joml.Vector3dc) Entity(io.xol.chunkstories.api.entity.Entity) HitBox(io.xol.chunkstories.api.entity.EntityLiving.HitBox) EntityLiving(io.xol.chunkstories.api.entity.EntityLiving) Vector3d(org.joml.Vector3d) Iterator(java.util.Iterator) EntityPlayer(io.xol.chunkstories.core.entity.EntityPlayer) CellData(io.xol.chunkstories.api.world.cell.CellData) WorldMaster(io.xol.chunkstories.api.world.WorldMaster) EditableCell(io.xol.chunkstories.api.world.cell.EditableCell) Location(io.xol.chunkstories.api.Location) CollisionBox(io.xol.chunkstories.api.physics.CollisionBox)

Example 3 with CollisionBox

use of io.xol.chunkstories.api.physics.CollisionBox in project chunkstories-core by Hugobros3.

the class VoxelPane method getCollisionBoxes.

@Override
public CollisionBox[] getCollisionBoxes(CellData info) {
    // System.out.println("kek");
    CollisionBox[] boxes = null;
    Voxel vox;
    vox = info.getNeightborVoxel(0);
    boolean connectLeft = (vox.getDefinition().isSolid() && vox.getDefinition().isOpaque()) || vox.equals(this);
    vox = info.getNeightborVoxel(1);
    boolean connectFront = (vox.getDefinition().isSolid() && vox.getDefinition().isOpaque()) || vox.equals(this);
    vox = info.getNeightborVoxel(2);
    boolean connectRight = (vox.getDefinition().isSolid() && vox.getDefinition().isOpaque()) || vox.equals(this);
    vox = info.getNeightborVoxel(3);
    boolean connectBack = (vox.getDefinition().isSolid() && vox.getDefinition().isOpaque()) || vox.equals(this);
    if (connectLeft && connectFront && connectRight && connectBack) {
        boxes = new CollisionBox[] { new CollisionBox(0.45, 0.0, 0.0, 0.1, 1, 1.0), new CollisionBox(0.0, 0.0, 0.45, 1.0, 1, 0.1) };
    } else if (connectLeft && connectFront && connectRight)
        boxes = new CollisionBox[] { new CollisionBox(0.0, 0.0, 0.45, 1.0, 1, 0.1), new CollisionBox(0.1, 1, 0.5).translate(0.45, 0, 0.5) };
    else if (connectLeft && connectFront && connectBack)
        boxes = new CollisionBox[] { new CollisionBox(0.45, 0.0, 0.0, 0.1, 1, 1.0), new CollisionBox(0.5, 1, 0.1).translate(0.0, 0, 0.45) };
    else if (connectLeft && connectBack && connectRight)
        boxes = new CollisionBox[] { new CollisionBox(0.0, 0.0, 0.45, 1.0, 1, 0.1), new CollisionBox(0.1, 1, 0.5).translate(0.45, 0, 0.0) };
    else if (connectBack && connectFront && connectRight)
        boxes = new CollisionBox[] { new CollisionBox(0.45, 0.0, 0.0, 0.1, 1, 1.0), new CollisionBox(0.5, 1, 0.1).translate(0.5, 0, 0.45) };
    else if (connectLeft && connectRight)
        boxes = new CollisionBox[] { new CollisionBox(0.0, 0.0, 0.45, 1.0, 1, 0.1) };
    else if (connectFront && connectBack)
        boxes = new CollisionBox[] { new CollisionBox(0.45, 0.0, 0.0, 0.1, 1, 1.0) };
    else if (connectLeft && connectBack)
        boxes = new CollisionBox[] { new CollisionBox(0.55, 1, 0.1).translate(0.0, 0, 0.45), new CollisionBox(0.1, 1, 0.55).translate(0.45, 0, 0.0) };
    else if (connectRight && connectBack)
        boxes = new CollisionBox[] { new CollisionBox(0.55, 1, 0.1).translate(0.45, 0, 0.45), new CollisionBox(0.1, 1, 0.55).translate(0.45, 0, 0.0) };
    else if (connectLeft && connectFront)
        boxes = new CollisionBox[] { new CollisionBox(0.55, 1, 0.1).translate(0, 0, 0.45), new CollisionBox(0.1, 1, 0.55).translate(0.45, 0, 0.45) };
    else if (connectRight && connectFront)
        boxes = new CollisionBox[] { new CollisionBox(0.55, 1, 0.1).translate(0.45, 0, 0.45), new CollisionBox(0.1, 1, 0.55).translate(0.45, 0, 0.45) };
    else if (connectLeft)
        boxes = new CollisionBox[] { new CollisionBox(0.0, 0.0, 0.45, 0.5, 1, 0.1).translate(0, 0, 0) };
    else if (connectRight)
        boxes = new CollisionBox[] { new CollisionBox(0.0, 0.0, 0.45, 0.5, 1, 0.1).translate(0.5, 0, 0) };
    else if (connectFront)
        boxes = new CollisionBox[] { new CollisionBox(0.45, 0.0, 0.0, 0.1, 1, 0.5).translate(0, 0, 0.5) };
    else if (connectBack)
        boxes = new CollisionBox[] { new CollisionBox(0.45, 0.0, 0.0, 0.1, 1, 0.5).translate(0, 0, 0.0) };
    else
        boxes = new CollisionBox[] { new CollisionBox(0.45, 0.0, 0.0, 0.1, 1, 1.0), new CollisionBox(0.0, 0.0, 0.45, 1.0, 1, 0.1) };
    return boxes;
}
Also used : Voxel(io.xol.chunkstories.api.voxel.Voxel) CollisionBox(io.xol.chunkstories.api.physics.CollisionBox)

Example 4 with CollisionBox

use of io.xol.chunkstories.api.physics.CollisionBox in project chunkstories-core by Hugobros3.

the class VoxelStoneWall method getCollisionBoxes.

@Override
public CollisionBox[] getCollisionBoxes(CellData info) {
    // System.out.println("kek");
    CollisionBox[] boxes = new CollisionBox[] { new CollisionBox(0.25, 0.0, 0.25, 0.5, 1.0, 0.5) };
    Voxel vox;
    vox = info.getNeightborVoxel(0);
    boolean connectLeft = (vox.getDefinition().isSolid() && vox.getDefinition().isOpaque()) || vox.equals(this);
    vox = info.getNeightborVoxel(1);
    boolean connectFront = (vox.getDefinition().isSolid() && vox.getDefinition().isOpaque()) || vox.equals(this);
    vox = info.getNeightborVoxel(2);
    boolean connectRight = (vox.getDefinition().isSolid() && vox.getDefinition().isOpaque()) || vox.equals(this);
    vox = info.getNeightborVoxel(3);
    boolean connectBack = (vox.getDefinition().isSolid() && vox.getDefinition().isOpaque()) || vox.equals(this);
    if (connectLeft && connectFront && connectRight && connectBack) {
        boxes = new CollisionBox[] { new CollisionBox(0.25, 0.0, 0.0, 0.5, 1, 1.0), new CollisionBox(0.0, 0.0, 0.25, 1.0, 1, 0.5) };
    } else if (connectLeft && connectFront && connectRight)
        boxes = new CollisionBox[] { new CollisionBox(0.0, 0.0, 0.25, 1.0, 1, 0.5), new CollisionBox(0.25, 0.0, 0.25, 0.5, 1, 0.5).translate(0, 0, 0.25) };
    else if (connectLeft && connectFront && connectBack)
        boxes = new CollisionBox[] { new CollisionBox(0.25, 0.0, 0.0, 0.5, 1, 1.0), new CollisionBox(0.25, 0.0, 0.25, 0.5, 1, 0.5).translate(-0.25, 0, 0) };
    else if (connectLeft && connectBack && connectRight)
        boxes = new CollisionBox[] { new CollisionBox(0.0, 0.0, 0.25, 1.0, 1, 0.5), new CollisionBox(0.25, 0.0, 0.25, 0.5, 1, 0.5).translate(0, 0, -0.25) };
    else if (connectBack && connectFront && connectRight)
        boxes = new CollisionBox[] { new CollisionBox(0.25, 0.0, 0.0, 0.5, 1, 1.0), new CollisionBox(0.25, 0.0, 0.25, 0.5, 1, 0.5).translate(0.25, 0, 0) };
    else if (connectLeft && connectRight)
        boxes = new CollisionBox[] { new CollisionBox(0.0, 0.0, 0.25, 1.0, 1, 0.5) };
    else if (connectFront && connectBack)
        boxes = new CollisionBox[] { new CollisionBox(0.25, 0.0, 0.0, 0.5, 1, 1.0) };
    else if (connectLeft && connectBack)
        boxes = new CollisionBox[] { new CollisionBox(0.125, 0.0, 0.25, 0.75, 1, 0.5).translate(-0.125, 0, 0), new CollisionBox(0.25, 0.0, 0.125, 0.5, 1, 0.75).translate(0, 0, -0.125) };
    else if (connectRight && connectBack)
        boxes = new CollisionBox[] { new CollisionBox(0.125, 0.0, 0.25, 0.75, 1, 0.5).translate(0.125, 0, 0), new CollisionBox(0.25, 0.0, 0.125, 0.5, 1, 0.75).translate(0, 0, -0.125) };
    else if (connectLeft && connectFront)
        boxes = new CollisionBox[] { new CollisionBox(0.125, 0.0, 0.25, 0.75, 1, 0.5).translate(-0.125, 0, 0), new CollisionBox(0.25, 0.0, 0.125, 0.5, 1, 0.75).translate(0, 0, 0.125) };
    else if (connectRight && connectFront)
        boxes = new CollisionBox[] { new CollisionBox(0.125, 0.0, 0.25, 0.75, 1, 0.5).translate(0.125, 0, 0), new CollisionBox(0.25, 0.0, 0.125, 0.5, 1, 0.750).translate(0, 0, 0.125) };
    else if (connectLeft)
        boxes = new CollisionBox[] { new CollisionBox(0.125, 0.0, 0.25, 0.75, 1, 0.5).translate(-0.125, 0, 0) };
    else if (connectRight)
        boxes = new CollisionBox[] { new CollisionBox(0.125, 0.0, 0.25, 0.75, 1, 0.5).translate(0.125, 0, 0) };
    else if (connectFront)
        boxes = new CollisionBox[] { new CollisionBox(0.25, 0.0, 0.125, 0.5, 1, 0.75).translate(0, 0, 0.125) };
    else if (connectBack)
        boxes = new CollisionBox[] { new CollisionBox(0.25, 0.0, 0.125, 0.5, 1, 0.75).translate(0.0, 0.0, -0.125) };
    return boxes;
}
Also used : Voxel(io.xol.chunkstories.api.voxel.Voxel) CollisionBox(io.xol.chunkstories.api.physics.CollisionBox)

Example 5 with CollisionBox

use of io.xol.chunkstories.api.physics.CollisionBox in project chunkstories-api by Hugobros3.

the class EntityBase method getTranslatedBoundingBox.

@Override
public CollisionBox getTranslatedBoundingBox() {
    CollisionBox box = getBoundingBox();
    box.translate(getLocation());
    return box;
}
Also used : CollisionBox(io.xol.chunkstories.api.physics.CollisionBox)

Aggregations

CollisionBox (io.xol.chunkstories.api.physics.CollisionBox)14 Location (io.xol.chunkstories.api.Location)5 CellData (io.xol.chunkstories.api.world.cell.CellData)5 Vector3d (org.joml.Vector3d)5 Voxel (io.xol.chunkstories.api.voxel.Voxel)4 Vector3dc (org.joml.Vector3dc)4 Entity (io.xol.chunkstories.api.entity.Entity)3 EntityLiving (io.xol.chunkstories.api.entity.EntityLiving)3 HitBox (io.xol.chunkstories.api.entity.EntityLiving.HitBox)3 Shader (io.xol.chunkstories.api.rendering.shader.Shader)3 HeightmapImplementation (io.xol.chunkstories.world.summary.HeightmapImplementation)3 ByteBuffer (java.nio.ByteBuffer)3 Player (io.xol.chunkstories.api.player.Player)2 Texture2D (io.xol.chunkstories.api.rendering.textures.Texture2D)2 WorldMaster (io.xol.chunkstories.api.world.WorldMaster)2 MemFreeByteBuffer (io.xol.chunkstories.client.util.MemFreeByteBuffer)2 EntityPlayer (io.xol.chunkstories.core.entity.EntityPlayer)2 Vector2d (org.joml.Vector2d)2 Vector4f (org.joml.Vector4f)2 EntityComponentRotation (io.xol.chunkstories.api.entity.components.EntityComponentRotation)1