use of io.xol.chunkstories.api.world.World.WorldCell 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;
}
use of io.xol.chunkstories.api.world.World.WorldCell in project chunkstories-core by Hugobros3.
the class ItemMiningTool method tickInHand.
@Override
public void tickInHand(Entity owner, ItemPile itemPile) {
World world = owner.getWorld();
if (owner instanceof EntityControllable && owner instanceof EntityWorldModifier) {
EntityControllable entityControllable = (EntityControllable) owner;
Controller controller = entityControllable.getController();
if (controller != null && controller instanceof Player) {
InputsManager inputs = controller.getInputsManager();
Location lookingAt = entityControllable.getBlockLookingAt(true);
if (lookingAt != null && lookingAt.distance(owner.getLocation()) > 7f)
lookingAt = null;
if (inputs.getInputByName("mouse.left").isPressed() && lookingAt != null) {
WorldCell cell = world.peekSafely(lookingAt);
// Cancel mining if looking away or the block changed by itself
if (lookingAt == null || (progress != null && (lookingAt.distance(progress.loc) > 0 || !cell.getVoxel().sameKind(progress.voxel)))) {
progress = null;
}
if (progress == null) {
// Try starting mining something
if (lookingAt != null)
progress = new MiningProgress(world.peekSafely(lookingAt));
} else {
// Progress using efficiency / ticks per second
progress.progress += ItemMiningTool.this.miningEfficiency / 60f / progress.materialHardnessForThisTool;
if (progress.progress >= 1.0f) {
if (owner.getWorld() instanceof WorldMaster) {
FutureCell future = new FutureCell(cell);
future.setVoxel(this.getDefinition().store().parent().voxels().air());
// Check no one minds
PlayerVoxelModificationEvent event = new PlayerVoxelModificationEvent(cell, future, (WorldModificationCause) entityControllable, (Player) controller);
owner.getWorld().getGameContext().getPluginManager().fireEvent(event);
// Break the block
if (!event.isCancelled()) {
Vector3d rnd = new Vector3d();
for (int i = 0; i < 40; i++) {
rnd.set(progress.loc);
rnd.add(Math.random() * 0.98, Math.random() * 0.98, Math.random() * 0.98);
world.getParticlesManager().spawnParticleAtPosition("voxel_frag", rnd);
}
world.getSoundManager().playSoundEffect("sounds/gameplay/voxel_remove.ogg", Mode.NORMAL, progress.loc, 1.0f, 1.0f);
Location itemSpawnLocation = new Location(world, progress.loc);
itemSpawnLocation.add(0.5, 0.0, 0.5);
// ItemPile droppedItemPile = null;
for (ItemPile droppedItemPile : cell.getVoxel().getLoot(cell, (WorldModificationCause) entityControllable)) {
EntityGroundItem thrownItem = (EntityGroundItem) getDefinition().store().parent().entities().getEntityDefinition("groundItem").create(itemSpawnLocation);
thrownItem.positionComponent.setPosition(itemSpawnLocation);
thrownItem.velocityComponent.setVelocity(new Vector3d(Math.random() * 0.125 - 0.0625, 0.1, Math.random() * 0.125 - 0.0625));
thrownItem.setItemPile(droppedItemPile);
world.addEntity(thrownItem);
}
try {
world.poke(future, (WorldModificationCause) entityControllable);
} catch (WorldException e) {
// Didn't work
// TODO make some ingame effect so as to clue in the player why it failed
}
}
}
progress = null;
}
}
} else {
progress = null;
}
Player player = (Player) controller;
if (player.getContext() instanceof ClientInterface) {
Player me = ((ClientInterface) player.getContext()).getPlayer();
if (me.equals(player)) {
myProgress = progress;
}
}
}
}
}
use of io.xol.chunkstories.api.world.World.WorldCell in project chunkstories by Hugobros3.
the class HeightmapImplementation method updateOnBlockModification.
@SuppressWarnings("deprecation")
public void updateOnBlockModification(int worldX, int height, int worldZ, FutureCell cell) {
if (!this.isLoaded())
return;
worldX &= 0xFF;
worldZ &= 0xFF;
int h = getHeight(worldX, worldZ);
// If we place something solid over the last solid thing
if ((cell.getVoxel().getDefinition().isSolid() || cell.getVoxel().getDefinition().isLiquid())) {
if (height >= h || h == Heightmap.NO_DATA) {
heights[index(worldX, worldZ)] = height;
ids[index(worldX, worldZ)] = cell.getData();
}
} else {
// If removing the top block, start a loop to find bottom.
if (height == h) {
int raw_data = cell.getData();
boolean loaded = false;
boolean solid = false;
boolean liquid = false;
do {
height--;
loaded = world.isChunkLoaded(worldX / 32, height / 32, worldZ / 32);
WorldCell celli = world.peekSafely(worldX, height, worldZ);
solid = celli.getVoxel().getDefinition().isSolid();
liquid = celli.getVoxel().getDefinition().isLiquid();
raw_data = world.peekRaw(worldX, height, worldZ);
} while (height >= 0 && loaded && !solid && !liquid);
if (loaded) {
heights[index(worldX, worldZ)] = height;
ids[index(worldX, worldZ)] = raw_data;
}
}
}
}
use of io.xol.chunkstories.api.world.World.WorldCell in project chunkstories-core by Hugobros3.
the class EntityPlayer method onControllerInput.
@Override
public boolean onControllerInput(Input input, Controller controller) {
// We are moving inventory bringup here !
if (input.getName().equals("inventory") && world instanceof WorldClient) {
if (creativeMode.get()) {
((WorldClient) getWorld()).getClient().openInventories(this.inventoryComponent.getInventory(), new InventoryLocalCreativeMenu(world));
} else {
((WorldClient) getWorld()).getClient().openInventories(this.inventoryComponent.getInventory(), this.armor.getInventory());
}
return true;
}
Location blockLocation = this.getBlockLookingAt(true);
double maxLen = 1024;
if (blockLocation != null) {
Vector3d diff = new Vector3d(blockLocation).sub(this.getLocation());
// Vector3d dir = diff.clone().normalize();
maxLen = diff.length();
}
Vector3d initialPosition = new Vector3d(getLocation());
initialPosition.add(new Vector3d(0, eyePosition, 0));
Vector3dc direction = getDirectionLookingAt();
Iterator<Entity> i = world.collisionsManager().rayTraceEntities(initialPosition, direction, maxLen);
while (i.hasNext()) {
Entity e = i.next();
if (e.handleInteraction(this, input))
return true;
}
ItemPile itemSelected = getSelectedItemComponent().getSelectedItem();
if (itemSelected != null) {
// See if the item handles the interaction
if (itemSelected.getItem().onControllerInput(this, itemSelected, input, controller))
return true;
}
if (getWorld() instanceof WorldMaster) {
// Creative mode features building and picking.
if (this.getCreativeModeComponent().get()) {
if (input.getName().equals("mouse.left")) {
if (blockLocation != null) {
// Player events mod
if (controller instanceof Player) {
Player player = (Player) controller;
WorldCell cell = world.peekSafely(blockLocation);
FutureCell future = new FutureCell(cell);
future.setVoxel(this.getDefinition().store().parent().voxels().air());
future.setBlocklight(0);
future.setSunlight(0);
future.setMetaData(0);
PlayerVoxelModificationEvent event = new PlayerVoxelModificationEvent(cell, future, EntityCreative.CREATIVE_MODE, player);
// Anyone has objections ?
world.getGameContext().getPluginManager().fireEvent(event);
if (event.isCancelled())
return true;
Vector3d rnd = new Vector3d();
for (int k = 0; k < 40; k++) {
rnd.set(blockLocation);
rnd.add(Math.random() * 0.98, Math.random() * 0.98, Math.random() * 0.98);
world.getParticlesManager().spawnParticleAtPosition("voxel_frag", rnd);
}
world.getSoundManager().playSoundEffect("sounds/gameplay/voxel_remove.ogg", Mode.NORMAL, blockLocation, 1.0f, 1.0f);
try {
world.poke(future, this);
// world.poke((int)blockLocation.x, (int)blockLocation.y, (int)blockLocation.z, null, 0, 0, 0, this);
} catch (WorldException e) {
// Discard but maybe play some effect ?
}
return true;
}
}
} else if (input.getName().equals("mouse.middle")) {
if (blockLocation != null) {
CellData ctx = this.getWorld().peekSafely(blockLocation);
if (!ctx.getVoxel().isAir()) {
// Spawn new itemPile in his inventory
ItemVoxel item = (ItemVoxel) world.getGameContext().getContent().items().getItemDefinition("item_voxel").newItem();
item.voxel = ctx.getVoxel();
item.voxelMeta = ctx.getMetaData();
ItemPile itemVoxel = new ItemPile(item);
this.getInventory().setItemPileAt(getSelectedItemComponent().getSelectedSlot(), 0, itemVoxel);
return true;
}
}
}
}
}
// Then we check if the world minds being interacted with
return world.handleInteraction(this, blockLocation, input);
}
Aggregations