/** * Use this method instead of {@link #newInstance(BlockFamily)} to modify entity properties like * the persistence flag before it gets created. * * @param blockFamily must not be null */ public EntityBuilder newBuilder(BlockFamily blockFamily, int quantity) { EntityBuilder builder = entityManager.newBuilder("engine:blockItemBase"); if (blockFamily.getArchetypeBlock().getLuminance() > 0) { builder.addComponent(new LightComponent()); } // Copy the components from block prefab into the block item Prefab prefab = Assets.getPrefab(blockFamily.getArchetypeBlock().getPrefab()); if (prefab != null) { for (Component component : prefab.iterateComponents()) { if (component.getClass().getAnnotation(AddToBlockBasedItem.class) != null) { builder.addComponent(entityManager.getComponentLibrary().copy(component)); } } } DisplayNameComponent displayNameComponent = builder.getComponent(DisplayNameComponent.class); displayNameComponent.name = blockFamily.getDisplayName(); ItemComponent item = builder.getComponent(ItemComponent.class); if (blockFamily.getArchetypeBlock().isStackable()) { item.stackId = "block:" + blockFamily.getURI().toString(); item.stackCount = (byte) quantity; } BlockItemComponent blockItem = builder.getComponent(BlockItemComponent.class); blockItem.blockFamily = blockFamily; return builder; }
public EntityRef newInstance(BlockFamily blockFamily, EntityRef blockEntity) { if (blockFamily == null) { return EntityRef.NULL; } EntityBuilder builder = entityManager.newBuilder("engine:blockItemBase"); if (blockFamily.getArchetypeBlock().getLuminance() > 0) { builder.addComponent(new LightComponent()); } // Copy the components from block prefab into the block item for (Component component : blockEntity.iterateComponents()) { if (component.getClass().getAnnotation(AddToBlockBasedItem.class) != null) { builder.addComponent(entityManager.getComponentLibrary().copy(component)); } } ItemComponent item = builder.getComponent(ItemComponent.class); if (blockFamily.getArchetypeBlock().isStackable()) { item.stackId = "block:" + blockFamily.getURI().toString(); item.stackCount = (byte) 1; } BlockItemComponent blockItem = builder.getComponent(BlockItemComponent.class); blockItem.blockFamily = blockFamily; return builder.build(); }
@ReceiveEvent public void onActivate( ActivateEvent event, EntityRef entity, TunnelActionComponent tunnelActionComponent) { Vector3f dir = new Vector3f(event.getDirection()); dir.scale(4.0f); Vector3f origin = new Vector3f(event.getOrigin()); origin.add(dir); Vector3i blockPos = new Vector3i(); int particleEffects = 0; int blockCounter = tunnelActionComponent.maxDestroyedBlocks; for (int s = 0; s <= tunnelActionComponent.maxTunnelDepth; s++) { origin.add(dir); if (!worldProvider.isBlockRelevant(origin)) { break; } for (int i = 0; i < tunnelActionComponent.maxRaysCast; i++) { Vector3f direction = random.nextVector3f(); Vector3f impulse = new Vector3f(direction); impulse.scale(tunnelActionComponent.explosiveForce); for (int j = 0; j < 3; 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); if (currentBlock.isDestructible()) { if (particleEffects < tunnelActionComponent.maxParticalEffects) { EntityBuilder builder = entityManager.newBuilder("engine:smokeExplosion"); builder.getComponent(LocationComponent.class).setWorldPosition(target); builder.build(); particleEffects++; } if (random.nextFloat() < tunnelActionComponent.thoroughness) { EntityRef blockEntity = blockEntityRegistry.getEntityAt(blockPos); blockEntity.send( new DoDamageEvent( tunnelActionComponent.damageAmount, tunnelActionComponent.damageType)); } blockCounter--; } if (blockCounter <= 0) { return; } } } } // No blocks were destroyed, so cancel the event if (blockCounter == tunnelActionComponent.maxDestroyedBlocks) { event.consume(); } }