/** * Randomises a provided Vector3f so its components range from -1.0 (inclusive) to 1.0 (inclusive) * * @param output * @return */ public Vector3f nextVector3f(Vector3f output) { return nextVector3f(-1.0f, 1.0f, output); }
/** * Returns a unit vector (length = 1) Vector3f whose components range from -1 (inclusive) to 1 (inclusive) * * @return The vector */ public Vector3f nextUnitVector3f() { return nextVector3f(1.0f); }
/** * Returns a Vector3f whose components range from -1.0 (inclusive) to 1.0 (inclusive) * * @return The vector */ public Vector3f nextVector3f() { return nextVector3f(new Vector3f()); }
/** * Returns a Vector3f with a given size whose components can range from -size (inclusive) to +size (inclusive) * * @param size * @return The vector */ public Vector3f nextVector3f(float size) { // Create a vector whose length is not zero Vector3f vector = new Vector3f(); do { nextVector3f(vector); } while (vector.x == 0.0f && vector.y == 0.0f && vector.z == 0.0f); float length = vector.length(); vector.scale(size / length); return vector; }
private void createDrop(EntityRef item, Vector3f location, boolean applyMovement) { item.send(new DropItemEvent(location)); if (applyMovement) { item.send(new ImpulseEvent(random.nextVector3f(30.0f))); } }
private void processDropping(EntityRef item, Vector3i location, float impulsePower) { item.send(new DropItemEvent(location.toVector3f())); item.send(new ImpulseEvent(random.nextVector3f(impulsePower))); }
void doExplosion(ExplosionActionComponent explosionComp, Vector3f origin, EntityRef instigatingBlockEntity) { EntityBuilder builder = entityManager.newBuilder("core:smokeExplosion"); builder.getComponent(LocationComponent.class).setWorldPosition(origin); EntityRef smokeEntity = builder.build(); smokeEntity.send(new PlaySoundEvent(getRandomExplosionSound(), 1f)); Vector3i blockPos = new Vector3i(); for (int i = 0; i < explosionComp.maxRange; i++) { Vector3f direction = random.nextVector3f(1.0f); for (int j = 0; j < 4; j++) { Vector3f target = new Vector3f(origin); target.x += direction.x * j; target.y += direction.y * j; target.z += direction.z * j; blockPos.set((int) target.x, (int) target.y, (int) target.z); Block currentBlock = worldProvider.getBlock(blockPos); /* PHYSICS */ if (currentBlock.isDestructible()) { EntityRef blockEntity = blockEntityRegistry.getEntityAt(blockPos); // allow explosions to chain together, but do not chain on the instigating block if (!blockEntity.equals(instigatingBlockEntity) && blockEntity.hasComponent(ExplosionActionComponent.class)) { doExplosion(blockEntity.getComponent(ExplosionActionComponent.class), blockPos.toVector3f(), blockEntity); } else { blockEntity.send(new DoDamageEvent(explosionComp.damageAmount, explosionComp.damageType)); } } } } }
Vector3f direction = random.nextVector3f(); Vector3f impulse = new Vector3f(direction); impulse.scale(tunnelActionComponent.explosiveForce);