Here to ruin the fun
- Rotational sources can now be connected to each other if their speeds have the same direction. Sources with slower speeds will be overpowered by the others. - Added a skeleton for torque mechanics. Very janky and unfinished
This commit is contained in:
parent
a1850ec90b
commit
5655fa0609
22 changed files with 501 additions and 71 deletions
|
@ -4,6 +4,7 @@ import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
import com.simibubi.create.modules.ModuleLoadedCondition;
|
import com.simibubi.create.modules.ModuleLoadedCondition;
|
||||||
|
import com.simibubi.create.modules.contraptions.TorquePropagator;
|
||||||
import com.simibubi.create.modules.contraptions.receivers.constructs.MovingConstructHandler;
|
import com.simibubi.create.modules.contraptions.receivers.constructs.MovingConstructHandler;
|
||||||
import com.simibubi.create.modules.logistics.FrequencyHandler;
|
import com.simibubi.create.modules.logistics.FrequencyHandler;
|
||||||
import com.simibubi.create.modules.logistics.management.LogisticalNetworkHandler;
|
import com.simibubi.create.modules.logistics.management.LogisticalNetworkHandler;
|
||||||
|
@ -42,6 +43,7 @@ public class Create {
|
||||||
public static FrequencyHandler frequencyHandler;
|
public static FrequencyHandler frequencyHandler;
|
||||||
public static MovingConstructHandler constructHandler;
|
public static MovingConstructHandler constructHandler;
|
||||||
public static LogisticalNetworkHandler logisticalNetworkHandler;
|
public static LogisticalNetworkHandler logisticalNetworkHandler;
|
||||||
|
public static TorquePropagator torquePropagator;
|
||||||
public static LogisticianHandler logisticianHandler;
|
public static LogisticianHandler logisticianHandler;
|
||||||
|
|
||||||
public static ModConfig config;
|
public static ModConfig config;
|
||||||
|
@ -66,6 +68,7 @@ public class Create {
|
||||||
frequencyHandler = new FrequencyHandler();
|
frequencyHandler = new FrequencyHandler();
|
||||||
constructHandler = new MovingConstructHandler();
|
constructHandler = new MovingConstructHandler();
|
||||||
logisticalNetworkHandler = new LogisticalNetworkHandler();
|
logisticalNetworkHandler = new LogisticalNetworkHandler();
|
||||||
|
torquePropagator = new TorquePropagator();
|
||||||
|
|
||||||
CraftingHelper.register(new ModuleLoadedCondition.Serializer());
|
CraftingHelper.register(new ModuleLoadedCondition.Serializer());
|
||||||
AllPackets.registerPackets();
|
AllPackets.registerPackets();
|
||||||
|
|
|
@ -46,6 +46,7 @@ public class Events {
|
||||||
Create.frequencyHandler.onLoadWorld(world);
|
Create.frequencyHandler.onLoadWorld(world);
|
||||||
Create.constructHandler.onLoadWorld(world);
|
Create.constructHandler.onLoadWorld(world);
|
||||||
Create.logisticalNetworkHandler.onLoadWorld(world);
|
Create.logisticalNetworkHandler.onLoadWorld(world);
|
||||||
|
Create.torquePropagator.onLoadWorld(world);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
|
@ -54,6 +55,7 @@ public class Events {
|
||||||
Create.frequencyHandler.onUnloadWorld(world);
|
Create.frequencyHandler.onUnloadWorld(world);
|
||||||
Create.constructHandler.onUnloadWorld(world);
|
Create.constructHandler.onUnloadWorld(world);
|
||||||
Create.logisticalNetworkHandler.onUnloadWorld(world);
|
Create.logisticalNetworkHandler.onUnloadWorld(world);
|
||||||
|
Create.torquePropagator.onUnloadWorld(world);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
|
|
|
@ -6,8 +6,12 @@ import java.util.Locale;
|
||||||
|
|
||||||
import com.simibubi.create.Create;
|
import com.simibubi.create.Create;
|
||||||
|
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.util.text.StringTextComponent;
|
||||||
import net.minecraft.util.text.TranslationTextComponent;
|
import net.minecraft.util.text.TranslationTextComponent;
|
||||||
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||||
|
|
||||||
public class Lang {
|
public class Lang {
|
||||||
|
|
||||||
|
@ -18,11 +22,26 @@ public class Lang {
|
||||||
private static TranslationTextComponent getTranslationComponent(String key, Object... args) {
|
private static TranslationTextComponent getTranslationComponent(String key, Object... args) {
|
||||||
return new TranslationTextComponent(Create.ID + "." + key, args);
|
return new TranslationTextComponent(Create.ID + "." + key, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void sendStatus(PlayerEntity player, String key, Object... args) {
|
public static void sendStatus(PlayerEntity player, String key, Object... args) {
|
||||||
player.sendStatusMessage(getTranslationComponent(key, args), true);
|
player.sendStatusMessage(getTranslationComponent(key, args), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deprecated so simi doensn't forget to remove debug calls
|
||||||
|
@OnlyIn(value = Dist.CLIENT)
|
||||||
|
@Deprecated
|
||||||
|
public static void debugChat(String message) {
|
||||||
|
if (Minecraft.getInstance().player != null)
|
||||||
|
Minecraft.getInstance().player.sendStatusMessage(new StringTextComponent(message), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnlyIn(value = Dist.CLIENT)
|
||||||
|
@Deprecated
|
||||||
|
public static void debugMessage(String message) {
|
||||||
|
if (Minecraft.getInstance().player != null)
|
||||||
|
Minecraft.getInstance().player.sendStatusMessage(new StringTextComponent(message), true);
|
||||||
|
}
|
||||||
|
|
||||||
public static List<String> translatedOptions(String prefix, String... keys) {
|
public static List<String> translatedOptions(String prefix, String... keys) {
|
||||||
List<String> result = new ArrayList<>(keys.length);
|
List<String> result = new ArrayList<>(keys.length);
|
||||||
for (String key : keys) {
|
for (String key : keys) {
|
||||||
|
@ -30,9 +49,9 @@ public class Lang {
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String asId(String name) {
|
public static String asId(String name) {
|
||||||
return name.toLowerCase(Locale.ENGLISH);
|
return name.toLowerCase(Locale.ENGLISH);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
package com.simibubi.create.modules.contraptions;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import com.simibubi.create.foundation.utility.Lang;
|
||||||
|
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||||
|
|
||||||
|
public class KineticNetwork {
|
||||||
|
|
||||||
|
public UUID id;
|
||||||
|
private float stressCapacityPool;
|
||||||
|
private float maxStress;
|
||||||
|
private float currentStress;
|
||||||
|
public boolean initialized;
|
||||||
|
|
||||||
|
public Map<KineticTileEntity, Float> sources;
|
||||||
|
public Set<KineticTileEntity> members;
|
||||||
|
|
||||||
|
public KineticNetwork() {
|
||||||
|
id = UUID.randomUUID();
|
||||||
|
maxStress = stressCapacityPool = 0;
|
||||||
|
setCurrentStress(0);
|
||||||
|
sources = new HashMap<>();
|
||||||
|
members = new HashSet<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initFromTE(KineticTileEntity te) {
|
||||||
|
maxStress = stressCapacityPool = te.maxStress;
|
||||||
|
currentStress = te.currentStress;
|
||||||
|
initialized = true;
|
||||||
|
addSilently(te);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSilently(KineticTileEntity te) {
|
||||||
|
if (members.contains(te))
|
||||||
|
return;
|
||||||
|
if (te.isSource()) {
|
||||||
|
float capacity = te.getAddedStressCapacity();
|
||||||
|
stressCapacityPool -= capacity;
|
||||||
|
sources.put(te, capacity);
|
||||||
|
}
|
||||||
|
members.add(te);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(KineticTileEntity te) {
|
||||||
|
if (members.contains(te))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Lang.debugChat(te.getType().getRegistryName().getPath() + " added to Network");
|
||||||
|
|
||||||
|
te.setNetworkID(this.id);
|
||||||
|
|
||||||
|
if (te.isSource()) {
|
||||||
|
float capacity = te.getAddedStressCapacity();
|
||||||
|
sources.put(te, capacity);
|
||||||
|
updateMaxStress();
|
||||||
|
}
|
||||||
|
members.add(te);
|
||||||
|
setCurrentStress(getCurrentStress() + te.getStressApplied());
|
||||||
|
sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateCapacityFor(KineticTileEntity te, float capacity) {
|
||||||
|
sources.put(te, capacity);
|
||||||
|
updateMaxStress();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remove(KineticTileEntity te) {
|
||||||
|
if (!members.contains(te))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Lang.debugChat(te.getType().getRegistryName().getPath() + " removed from Network");
|
||||||
|
|
||||||
|
if (te.isSource()) {
|
||||||
|
sources.remove(te);
|
||||||
|
updateMaxStress();
|
||||||
|
}
|
||||||
|
members.remove(te);
|
||||||
|
setCurrentStress(getCurrentStress() - te.getStressApplied());
|
||||||
|
sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sync() {
|
||||||
|
for (KineticTileEntity te : members) {
|
||||||
|
te.sync(id, getMaxStress(), getCurrentStress());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getMaxStress() {
|
||||||
|
return maxStress;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateMaxStress() {
|
||||||
|
float presentCapacity = 0;
|
||||||
|
for (Float cap : sources.values())
|
||||||
|
presentCapacity += cap;
|
||||||
|
float newMaxStress = presentCapacity + stressCapacityPool;
|
||||||
|
if (maxStress != newMaxStress) {
|
||||||
|
maxStress = newMaxStress;
|
||||||
|
sync();
|
||||||
|
}
|
||||||
|
Lang.debugChat("Current Stress level: " + currentStress + "/" + maxStress);
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getCurrentStress() {
|
||||||
|
return currentStress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCurrentStress(float currentStress) {
|
||||||
|
this.currentStress = currentStress;
|
||||||
|
Lang.debugChat("Current Stress level: " + currentStress + "/" + maxStress);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -173,8 +173,7 @@ public class RotationPropagator {
|
||||||
return;
|
return;
|
||||||
if (!worldIn.isBlockPresent(pos))
|
if (!worldIn.isBlockPresent(pos))
|
||||||
return;
|
return;
|
||||||
|
if (addedTE.speed != 0) {
|
||||||
if (addedTE.getSpeed() != 0) {
|
|
||||||
propagateNewSource(addedTE);
|
propagateNewSource(addedTE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -182,16 +181,16 @@ public class RotationPropagator {
|
||||||
for (KineticTileEntity neighbourTE : getConnectedNeighbours(addedTE)) {
|
for (KineticTileEntity neighbourTE : getConnectedNeighbours(addedTE)) {
|
||||||
final float speedModifier = getRotationSpeedModifier(neighbourTE, addedTE);
|
final float speedModifier = getRotationSpeedModifier(neighbourTE, addedTE);
|
||||||
|
|
||||||
if (neighbourTE.getSpeed() == 0)
|
if (neighbourTE.speed == 0)
|
||||||
continue;
|
continue;
|
||||||
if (neighbourTE.hasSource() && neighbourTE.getSource().equals(addedTE.getPos())) {
|
if (neighbourTE.hasSource() && neighbourTE.getSource().equals(addedTE.getPos())) {
|
||||||
addedTE.setSpeed(neighbourTE.getSpeed() * speedModifier);
|
addedTE.setSpeed(neighbourTE.speed * speedModifier);
|
||||||
addedTE.onSpeedChanged();
|
addedTE.onSpeedChanged();
|
||||||
addedTE.sendData();
|
addedTE.sendData();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
addedTE.setSpeed(neighbourTE.getSpeed() * speedModifier);
|
addedTE.setSpeed(neighbourTE.speed * speedModifier);
|
||||||
addedTE.setSource(neighbourTE.getPos());
|
addedTE.setSource(neighbourTE.getPos());
|
||||||
addedTE.onSpeedChanged();
|
addedTE.onSpeedChanged();
|
||||||
addedTE.sendData();
|
addedTE.sendData();
|
||||||
|
@ -210,18 +209,63 @@ public class RotationPropagator {
|
||||||
World world = updateTE.getWorld();
|
World world = updateTE.getWorld();
|
||||||
|
|
||||||
for (KineticTileEntity neighbourTE : getConnectedNeighbours(updateTE)) {
|
for (KineticTileEntity neighbourTE : getConnectedNeighbours(updateTE)) {
|
||||||
final float newSpeed = updateTE.getSpeed() * getRotationSpeedModifier(updateTE, neighbourTE);
|
float modFromTo = getRotationSpeedModifier(updateTE, neighbourTE);
|
||||||
|
float modToFrom = getRotationSpeedModifier(neighbourTE, updateTE);
|
||||||
|
final float newSpeed = updateTE.speed * modFromTo;
|
||||||
|
float oppositeSpeed = neighbourTE.speed * modToFrom;
|
||||||
|
|
||||||
if ((neighbourTE.isSource())
|
boolean incompatible = Math.signum(newSpeed) != Math.signum(neighbourTE.speed)
|
||||||
|| neighbourTE.hasSource() && !neighbourTE.getSource().equals(updateTE.getPos())) {
|
&& (newSpeed != 0 && neighbourTE.speed != 0);
|
||||||
if (neighbourTE.getSpeed() != newSpeed || Math.abs(newSpeed) > parameters.maxRotationSpeed.get()) {
|
|
||||||
world.destroyBlock(pos, true);
|
boolean tooFast = Math.abs(newSpeed) > parameters.maxRotationSpeed.get();
|
||||||
return;
|
if (tooFast) {
|
||||||
|
world.destroyBlock(pos, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isSource = neighbourTE.isSource();
|
||||||
|
boolean hasSource = neighbourTE.hasSource();
|
||||||
|
boolean poweredBySomethingElse = isSource
|
||||||
|
|| hasSource && !neighbourTE.getSource().equals(updateTE.getPos());
|
||||||
|
|
||||||
|
if (poweredBySomethingElse) {
|
||||||
|
if (neighbourTE.speed != newSpeed) {
|
||||||
|
if (incompatible) {
|
||||||
|
// Opposite directions
|
||||||
|
world.destroyBlock(pos, true);
|
||||||
|
return;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Same direction: overpower the slower speed
|
||||||
|
if (Math.abs(oppositeSpeed) > Math.abs(updateTE.speed)) {
|
||||||
|
// Neighbour faster, overpower the incoming tree
|
||||||
|
updateTE.setSource(neighbourTE.getPos());
|
||||||
|
updateTE.setSpeed(neighbourTE.speed * getRotationSpeedModifier(neighbourTE, updateTE));
|
||||||
|
updateTE.onSpeedChanged();
|
||||||
|
updateTE.sendData();
|
||||||
|
propagateNewSource(updateTE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Math.abs(newSpeed) > Math.abs(neighbourTE.speed)) {
|
||||||
|
// Current faster, overpower the neighbours' tree
|
||||||
|
|
||||||
|
if (updateTE.hasSource() && updateTE.getSource().equals(neighbourTE.getPos())) {
|
||||||
|
updateTE.removeSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
neighbourTE.setSource(updateTE.getPos());
|
||||||
|
neighbourTE.setSpeed(updateTE.speed * getRotationSpeedModifier(updateTE, neighbourTE));
|
||||||
|
neighbourTE.onSpeedChanged();
|
||||||
|
neighbourTE.sendData();
|
||||||
|
propagateNewSource(neighbourTE);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (neighbourTE.getSpeed() == newSpeed)
|
if (neighbourTE.speed == newSpeed)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
neighbourTE.setSpeed(newSpeed);
|
neighbourTE.setSpeed(newSpeed);
|
||||||
|
@ -245,7 +289,7 @@ public class RotationPropagator {
|
||||||
return;
|
return;
|
||||||
if (removedTE == null)
|
if (removedTE == null)
|
||||||
return;
|
return;
|
||||||
if (removedTE.getSpeed() == 0)
|
if (removedTE.speed == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (BlockPos neighbourPos : getPotentialNeighbourLocations(removedTE)) {
|
for (BlockPos neighbourPos : getPotentialNeighbourLocations(removedTE)) {
|
||||||
|
@ -254,7 +298,7 @@ public class RotationPropagator {
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
final KineticTileEntity neighbourTE = (KineticTileEntity) worldIn.getTileEntity(neighbourPos);
|
final KineticTileEntity neighbourTE = (KineticTileEntity) worldIn.getTileEntity(neighbourPos);
|
||||||
if (!neighbourTE.hasSource() || !neighbourTE.getSource().equals(pos) || neighbourTE.isSource())
|
if (!neighbourTE.hasSource() || !neighbourTE.getSource().equals(pos))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
propagateMissingSource(neighbourTE);
|
propagateMissingSource(neighbourTE);
|
||||||
|
@ -283,11 +327,6 @@ public class RotationPropagator {
|
||||||
currentTE.sendData();
|
currentTE.sendData();
|
||||||
|
|
||||||
for (KineticTileEntity neighbourTE : getConnectedNeighbours(currentTE)) {
|
for (KineticTileEntity neighbourTE : getConnectedNeighbours(currentTE)) {
|
||||||
if (neighbourTE.isSource()) {
|
|
||||||
potentialNewSources.add(neighbourTE);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!neighbourTE.hasSource())
|
if (!neighbourTE.hasSource())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -296,6 +335,10 @@ public class RotationPropagator {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (neighbourTE.isSource()) {
|
||||||
|
potentialNewSources.add(neighbourTE);
|
||||||
|
}
|
||||||
|
|
||||||
frontier.add(neighbourTE.getPos());
|
frontier.add(neighbourTE.getPos());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
package com.simibubi.create.modules.contraptions;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import com.simibubi.create.Create;
|
||||||
|
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||||
|
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.util.text.StringTextComponent;
|
||||||
|
import net.minecraft.world.IWorld;
|
||||||
|
|
||||||
|
public class TorquePropagator {
|
||||||
|
|
||||||
|
static Map<IWorld, Map<UUID, KineticNetwork>> networks = new HashMap<>();
|
||||||
|
|
||||||
|
public void onLoadWorld(IWorld world) {
|
||||||
|
networks.put(world, new HashMap<>());
|
||||||
|
Create.logger.debug("Prepared Kinetic Network Space for " + world.getDimension().getType().getRegistryName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onUnloadWorld(IWorld world) {
|
||||||
|
networks.remove(world);
|
||||||
|
Create.logger.debug("Removed Kinetic Network Space for " + world.getDimension().getType().getRegistryName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public KineticNetwork getNetworkFor(KineticTileEntity te) {
|
||||||
|
UUID id = te.getNetworkID();
|
||||||
|
KineticNetwork network;
|
||||||
|
Map<UUID, KineticNetwork> map = networks.get(te.getWorld());
|
||||||
|
if (id == null) {
|
||||||
|
network = new KineticNetwork();
|
||||||
|
|
||||||
|
//TODO
|
||||||
|
Minecraft.getInstance().player.sendStatusMessage(new StringTextComponent(te.getType().getRegistryName().getPath() + " created new Network"), false);
|
||||||
|
|
||||||
|
map.put(id, network);
|
||||||
|
} else {
|
||||||
|
if (!map.containsKey(id)) {
|
||||||
|
network = new KineticNetwork();
|
||||||
|
network.id = te.getNetworkID();
|
||||||
|
map.put(id, network);
|
||||||
|
}
|
||||||
|
network = map.get(id);
|
||||||
|
}
|
||||||
|
return network;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -2,70 +2,129 @@ package com.simibubi.create.modules.contraptions.base;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import com.simibubi.create.Create;
|
||||||
import com.simibubi.create.foundation.block.SyncedTileEntity;
|
import com.simibubi.create.foundation.block.SyncedTileEntity;
|
||||||
|
import com.simibubi.create.foundation.utility.Lang;
|
||||||
|
import com.simibubi.create.modules.contraptions.KineticNetwork;
|
||||||
import com.simibubi.create.modules.contraptions.RotationPropagator;
|
import com.simibubi.create.modules.contraptions.RotationPropagator;
|
||||||
|
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
import net.minecraft.nbt.NBTUtil;
|
import net.minecraft.nbt.NBTUtil;
|
||||||
import net.minecraft.particles.RedstoneParticleData;
|
import net.minecraft.particles.RedstoneParticleData;
|
||||||
|
import net.minecraft.tileentity.ITickableTileEntity;
|
||||||
import net.minecraft.tileentity.TileEntityType;
|
import net.minecraft.tileentity.TileEntityType;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
public abstract class KineticTileEntity extends SyncedTileEntity {
|
public abstract class KineticTileEntity extends SyncedTileEntity implements ITickableTileEntity {
|
||||||
|
|
||||||
protected float speed;
|
public float speed;
|
||||||
protected float force;
|
|
||||||
protected Optional<BlockPos> source;
|
protected Optional<BlockPos> source;
|
||||||
|
public boolean reActivateSource;
|
||||||
|
|
||||||
|
public float maxStress;
|
||||||
|
public float currentStress;
|
||||||
|
public UUID networkID;
|
||||||
|
protected boolean overStressed;
|
||||||
|
protected boolean initNetwork;
|
||||||
|
|
||||||
public KineticTileEntity(TileEntityType<?> typeIn) {
|
public KineticTileEntity(TileEntityType<?> typeIn) {
|
||||||
super(typeIn);
|
super(typeIn);
|
||||||
speed = 0;
|
speed = 0;
|
||||||
force = 0;
|
|
||||||
source = Optional.empty();
|
source = Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void sync(UUID networkID, float maxStress, float currentStress) {
|
||||||
|
this.setNetworkID(networkID);
|
||||||
|
this.maxStress = maxStress;
|
||||||
|
this.currentStress = currentStress;
|
||||||
|
boolean overStressed = maxStress < currentStress;
|
||||||
|
if (overStressed != this.overStressed) {
|
||||||
|
|
||||||
|
Lang.debugChat(getType().getRegistryName().getPath() + " jammed (" + currentStress + "/" + maxStress + ")");
|
||||||
|
|
||||||
|
this.overStressed = overStressed;
|
||||||
|
sendData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getAddedStressCapacity() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getStressApplied() {
|
||||||
|
return isSource() ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void notifyStressChange(float diff) {
|
||||||
|
KineticNetwork network = getNetwork();
|
||||||
|
network.setCurrentStress(network.getCurrentStress() + diff);
|
||||||
|
network.sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void notifyStressCapacityChange(float capacity) {
|
||||||
|
getNetwork().updateCapacityFor(this, capacity);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasFastRenderer() {
|
public boolean hasFastRenderer() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onSpeedChanged() {
|
public void onSpeedChanged() {
|
||||||
|
// if (isSource() && !world.isRemote) {
|
||||||
|
// if (networkID == null)
|
||||||
|
// getNetwork().add(this);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void remove() {
|
public void remove() {
|
||||||
if (world.isRemote) {
|
if (world.isRemote) {
|
||||||
super.remove();
|
super.remove();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (hasNetwork()) {
|
||||||
|
getNetwork().remove(this);
|
||||||
|
}
|
||||||
RotationPropagator.handleRemoved(getWorld(), getPos(), this);
|
RotationPropagator.handleRemoved(getWorld(), getPos(), this);
|
||||||
super.remove();
|
super.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompoundNBT write(CompoundNBT compound) {
|
public CompoundNBT write(CompoundNBT compound) {
|
||||||
compound.putFloat("Speed", getSpeed());
|
compound.putFloat("Speed", speed);
|
||||||
compound.putFloat("Force", getForce());
|
|
||||||
|
|
||||||
if (hasSource())
|
if (hasSource())
|
||||||
compound.put("Source", NBTUtil.writeBlockPos(getSource()));
|
compound.put("Source", NBTUtil.writeBlockPos(getSource()));
|
||||||
|
|
||||||
|
if (hasNetwork()) {
|
||||||
|
compound.putFloat("MaxStress", maxStress);
|
||||||
|
compound.putFloat("Stress", currentStress);
|
||||||
|
compound.put("Id", NBTUtil.writeUniqueId(getNetworkID()));
|
||||||
|
}
|
||||||
|
|
||||||
return super.write(compound);
|
return super.write(compound);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void read(CompoundNBT compound) {
|
public void read(CompoundNBT compound) {
|
||||||
setSpeed(compound.getFloat("Speed"));
|
setSpeed(compound.getFloat("Speed"));
|
||||||
setForce(compound.getFloat("Force"));
|
|
||||||
|
|
||||||
setSource(null);
|
setSource(null);
|
||||||
if (compound.contains("Source")) {
|
if (compound.contains("Source")) {
|
||||||
CompoundNBT tagSource = compound.getCompound("Source");
|
CompoundNBT tagSource = compound.getCompound("Source");
|
||||||
setSource(NBTUtil.readBlockPos(tagSource));
|
setSource(NBTUtil.readBlockPos(tagSource));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (compound.contains("Id")) {
|
||||||
|
maxStress = compound.getFloat("MaxStress");
|
||||||
|
currentStress = compound.getFloat("Stress");
|
||||||
|
overStressed = maxStress < currentStress;
|
||||||
|
setNetworkID(NBTUtil.readUniqueId(compound.getCompound("Id")));
|
||||||
|
initNetwork = true;
|
||||||
|
}
|
||||||
|
|
||||||
super.read(compound);
|
super.read(compound);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,6 +133,8 @@ public abstract class KineticTileEntity extends SyncedTileEntity {
|
||||||
}
|
}
|
||||||
|
|
||||||
public float getSpeed() {
|
public float getSpeed() {
|
||||||
|
if (overStressed)
|
||||||
|
return 0;
|
||||||
return speed;
|
return speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,14 +151,6 @@ public abstract class KineticTileEntity extends SyncedTileEntity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public float getForce() {
|
|
||||||
return force;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setForce(float force) {
|
|
||||||
this.force = force;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasSource() {
|
public boolean hasSource() {
|
||||||
return source.isPresent();
|
return source.isPresent();
|
||||||
}
|
}
|
||||||
|
@ -113,26 +166,95 @@ public abstract class KineticTileEntity extends SyncedTileEntity {
|
||||||
|
|
||||||
public void setSource(BlockPos source) {
|
public void setSource(BlockPos source) {
|
||||||
this.source = Optional.ofNullable(source);
|
this.source = Optional.ofNullable(source);
|
||||||
|
|
||||||
|
if (world == null || world.isRemote)
|
||||||
|
return;
|
||||||
|
if (hasNetwork()) {
|
||||||
|
getNetwork().remove(this);
|
||||||
|
networkID = null;
|
||||||
|
}
|
||||||
|
if (source == null)
|
||||||
|
return;
|
||||||
|
KineticTileEntity sourceTe = (KineticTileEntity) world.getTileEntity(source);
|
||||||
|
if (sourceTe == null)
|
||||||
|
return;
|
||||||
|
Create.torquePropagator.getNetworkFor(sourceTe).add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeSource() {
|
public void removeSource() {
|
||||||
|
if (hasSource() && isSource())
|
||||||
|
reActivateSource = true;
|
||||||
|
|
||||||
this.source = Optional.empty();
|
this.source = Optional.empty();
|
||||||
|
|
||||||
|
if (hasNetwork() && !isSource()) {
|
||||||
|
getNetwork().remove(this);
|
||||||
|
networkID = null;
|
||||||
|
}
|
||||||
|
|
||||||
setSpeed(0);
|
setSpeed(0);
|
||||||
onSpeedChanged();
|
onSpeedChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public KineticNetwork getNetwork() {
|
||||||
|
KineticNetwork networkFor = Create.torquePropagator.getNetworkFor(this);
|
||||||
|
if (!networkFor.initialized) {
|
||||||
|
networkFor.add(this);
|
||||||
|
networkFor.initialized = true;
|
||||||
|
}
|
||||||
|
return networkFor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasNetwork() {
|
||||||
|
return networkID != null;
|
||||||
|
}
|
||||||
|
|
||||||
public void applyNewSpeed(float speed) {
|
public void applyNewSpeed(float speed) {
|
||||||
detachKinetics();
|
detachKinetics();
|
||||||
this.speed = speed;
|
this.speed = speed;
|
||||||
attachKinetics();
|
attachKinetics();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void attachKinetics() {
|
public void attachKinetics() {
|
||||||
RotationPropagator.handleAdded(world, pos, this);
|
RotationPropagator.handleAdded(world, pos, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void detachKinetics() {
|
public void detachKinetics() {
|
||||||
RotationPropagator.handleRemoved(world, pos, this);
|
RotationPropagator.handleRemoved(world, pos, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UUID getNetworkID() {
|
||||||
|
return networkID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNetworkID(UUID networkID) {
|
||||||
|
this.networkID = networkID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback for source blocks to re-apply their speed when an overpowering
|
||||||
|
* source is removed
|
||||||
|
*/
|
||||||
|
public void reActivateSource() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tick() {
|
||||||
|
if (reActivateSource) {
|
||||||
|
reActivateSource();
|
||||||
|
reActivateSource = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (initNetwork) {
|
||||||
|
initNetwork = false;
|
||||||
|
KineticNetwork network = getNetwork();
|
||||||
|
if (network.initialized) {
|
||||||
|
network.addSilently(this);
|
||||||
|
} else {
|
||||||
|
network.initFromTE(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,10 +5,9 @@ import com.simibubi.create.AllTileEntities;
|
||||||
import com.simibubi.create.CreateConfig;
|
import com.simibubi.create.CreateConfig;
|
||||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||||
|
|
||||||
import net.minecraft.tileentity.ITickableTileEntity;
|
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
|
|
||||||
public class MotorTileEntity extends KineticTileEntity implements ITickableTileEntity {
|
public class MotorTileEntity extends KineticTileEntity {
|
||||||
|
|
||||||
public static final int DEFAULT_SPEED = 64;
|
public static final int DEFAULT_SPEED = 64;
|
||||||
public int newSpeed;
|
public int newSpeed;
|
||||||
|
@ -17,8 +16,14 @@ public class MotorTileEntity extends KineticTileEntity implements ITickableTileE
|
||||||
public MotorTileEntity() {
|
public MotorTileEntity() {
|
||||||
super(AllTileEntities.MOTOR.type);
|
super(AllTileEntities.MOTOR.type);
|
||||||
setSpeed(DEFAULT_SPEED);
|
setSpeed(DEFAULT_SPEED);
|
||||||
|
lastModified = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getAddedStressCapacity() {
|
||||||
|
return 500;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasFastRenderer() {
|
public boolean hasFastRenderer() {
|
||||||
return true;
|
return true;
|
||||||
|
@ -34,6 +39,13 @@ public class MotorTileEntity extends KineticTileEntity implements ITickableTileE
|
||||||
super.setSpeed(speed);
|
super.setSpeed(speed);
|
||||||
newSpeed = (int) speed;
|
newSpeed = (int) speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeSource() {
|
||||||
|
float speed = this.speed;
|
||||||
|
super.removeSource();
|
||||||
|
setSpeed(speed);
|
||||||
|
}
|
||||||
|
|
||||||
public int getSpeedValue() {
|
public int getSpeedValue() {
|
||||||
if (world.isRemote)
|
if (world.isRemote)
|
||||||
|
@ -56,6 +68,8 @@ public class MotorTileEntity extends KineticTileEntity implements ITickableTileE
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
|
super.tick();
|
||||||
|
|
||||||
if (!world.isRemote)
|
if (!world.isRemote)
|
||||||
return;
|
return;
|
||||||
if (lastModified == -1)
|
if (lastModified == -1)
|
||||||
|
|
|
@ -83,7 +83,7 @@ public class WaterWheelBlock extends HorizontalKineticBlock {
|
||||||
|
|
||||||
flowVec = flowVec.scale(f.getAxisDirection().getOffset());
|
flowVec = flowVec.scale(f.getAxisDirection().getOffset());
|
||||||
boolean clockwise = wf.getAxisDirection() == AxisDirection.POSITIVE;
|
boolean clockwise = wf.getAxisDirection() == AxisDirection.POSITIVE;
|
||||||
int clockwiseMultiplier = 1; // No difference. Causes confusion
|
int clockwiseMultiplier = 2;
|
||||||
|
|
||||||
if (wf.getAxis() == Axis.Z) {
|
if (wf.getAxis() == Axis.Z) {
|
||||||
if (f.getAxis() == Axis.Y)
|
if (f.getAxis() == Axis.Y)
|
||||||
|
@ -103,6 +103,8 @@ public class WaterWheelBlock extends HorizontalKineticBlock {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateWheelSpeed(IWorld world, BlockPos pos) {
|
private void updateWheelSpeed(IWorld world, BlockPos pos) {
|
||||||
|
if (world.isRemote())
|
||||||
|
return;
|
||||||
WaterWheelTileEntity te = (WaterWheelTileEntity) world.getTileEntity(pos);
|
WaterWheelTileEntity te = (WaterWheelTileEntity) world.getTileEntity(pos);
|
||||||
if (te == null)
|
if (te == null)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.simibubi.create.modules.contraptions.generators;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import com.simibubi.create.AllTileEntities;
|
import com.simibubi.create.AllTileEntities;
|
||||||
import com.simibubi.create.modules.contraptions.RotationPropagator;
|
import com.simibubi.create.modules.contraptions.RotationPropagator;
|
||||||
|
@ -32,7 +33,7 @@ public class WaterWheelTileEntity extends KineticTileEntity {
|
||||||
setFlow(d, compound.getCompound("Flows").getInt(d.getName()));
|
setFlow(d, compound.getCompound("Flows").getInt(d.getName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AxisAlignedBB getRenderBoundingBox() {
|
public AxisAlignedBB getRenderBoundingBox() {
|
||||||
return new AxisAlignedBB(pos).grow(1);
|
return new AxisAlignedBB(pos).grow(1);
|
||||||
|
@ -45,7 +46,7 @@ public class WaterWheelTileEntity extends KineticTileEntity {
|
||||||
for (Direction d : Direction.values())
|
for (Direction d : Direction.values())
|
||||||
flows.putInt(d.getName(), this.flows.get(d));
|
flows.putInt(d.getName(), this.flows.get(d));
|
||||||
compound.put("Flows", flows);
|
compound.put("Flows", flows);
|
||||||
|
|
||||||
return super.write(compound);
|
return super.write(compound);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,19 +54,27 @@ public class WaterWheelTileEntity extends KineticTileEntity {
|
||||||
flows.put(direction, speed);
|
flows.put(direction, speed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reActivateSource() {
|
||||||
|
updateSpeed();
|
||||||
|
}
|
||||||
|
|
||||||
public void updateSpeed() {
|
public void updateSpeed() {
|
||||||
float speed = 0;
|
float speed = 0;
|
||||||
for (Integer i : flows.values())
|
for (Integer i : flows.values())
|
||||||
speed += i;
|
speed += i;
|
||||||
|
|
||||||
if (this.speed != speed) {
|
if (this.speed != speed) {
|
||||||
|
hasFlows = speed != 0;
|
||||||
|
notifyStressCapacityChange(getAddedStressCapacity());
|
||||||
|
source = Optional.empty();
|
||||||
RotationPropagator.handleRemoved(world, pos, this);
|
RotationPropagator.handleRemoved(world, pos, this);
|
||||||
this.setSpeed(speed);
|
this.setSpeed(speed);
|
||||||
hasFlows = speed != 0;
|
|
||||||
sendData();
|
sendData();
|
||||||
RotationPropagator.handleAdded(world, pos, this);
|
RotationPropagator.handleAdded(world, pos, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onSpeedChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -73,4 +82,12 @@ public class WaterWheelTileEntity extends KineticTileEntity {
|
||||||
return hasFlows;
|
return hasFlows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getAddedStressCapacity() {
|
||||||
|
float torque = 0;
|
||||||
|
for (Integer i : flows.values())
|
||||||
|
torque += i;
|
||||||
|
return Math.abs(torque);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,6 @@ import net.minecraft.fluid.IFluidState;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
import net.minecraft.state.properties.BlockStateProperties;
|
import net.minecraft.state.properties.BlockStateProperties;
|
||||||
import net.minecraft.tileentity.ITickableTileEntity;
|
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.DamageSource;
|
import net.minecraft.util.DamageSource;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
|
@ -25,7 +24,7 @@ import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.GameRules;
|
import net.minecraft.world.GameRules;
|
||||||
import net.minecraft.world.server.ServerWorld;
|
import net.minecraft.world.server.ServerWorld;
|
||||||
|
|
||||||
public class DrillTileEntity extends KineticTileEntity implements ITickableTileEntity {
|
public class DrillTileEntity extends KineticTileEntity {
|
||||||
|
|
||||||
private static final AtomicInteger NEXT_DRILL_ID = new AtomicInteger();
|
private static final AtomicInteger NEXT_DRILL_ID = new AtomicInteger();
|
||||||
|
|
||||||
|
@ -73,6 +72,8 @@ public class DrillTileEntity extends KineticTileEntity implements ITickableTileE
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
|
super.tick();
|
||||||
|
|
||||||
if (world.isRemote)
|
if (world.isRemote)
|
||||||
return;
|
return;
|
||||||
if (speed == 0)
|
if (speed == 0)
|
||||||
|
|
|
@ -6,6 +6,7 @@ import static net.minecraft.util.Direction.AxisDirection.NEGATIVE;
|
||||||
import static net.minecraft.util.Direction.AxisDirection.POSITIVE;
|
import static net.minecraft.util.Direction.AxisDirection.POSITIVE;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import com.simibubi.create.AllBlockTags;
|
import com.simibubi.create.AllBlockTags;
|
||||||
import com.simibubi.create.AllBlocks;
|
import com.simibubi.create.AllBlocks;
|
||||||
|
@ -24,7 +25,6 @@ import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.item.ItemEntity;
|
import net.minecraft.entity.item.ItemEntity;
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
import net.minecraft.particles.ParticleTypes;
|
import net.minecraft.particles.ParticleTypes;
|
||||||
import net.minecraft.tileentity.ITickableTileEntity;
|
|
||||||
import net.minecraft.util.DamageSource;
|
import net.minecraft.util.DamageSource;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.SoundCategory;
|
import net.minecraft.util.SoundCategory;
|
||||||
|
@ -35,7 +35,7 @@ import net.minecraft.util.math.MathHelper;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.util.math.Vec3i;
|
import net.minecraft.util.math.Vec3i;
|
||||||
|
|
||||||
public class EncasedFanTileEntity extends KineticTileEntity implements ITickableTileEntity {
|
public class EncasedFanTileEntity extends KineticTileEntity {
|
||||||
|
|
||||||
private static DamageSource damageSourceFire = new DamageSource("create.fan_fire").setDifficultyScaled()
|
private static DamageSource damageSourceFire = new DamageSource("create.fan_fire").setDifficultyScaled()
|
||||||
.setFireDamage();
|
.setFireDamage();
|
||||||
|
@ -91,14 +91,23 @@ public class EncasedFanTileEntity extends KineticTileEntity implements ITickable
|
||||||
return isGenerator;
|
return isGenerator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getAddedStressCapacity() {
|
||||||
|
return 50;
|
||||||
|
}
|
||||||
|
|
||||||
public void updateGenerator() {
|
public void updateGenerator() {
|
||||||
boolean shouldGenerate = world.isBlockPowered(pos) && world.isBlockPresent(pos.down()) && blockBelowIsHot();
|
boolean shouldGenerate = world.isBlockPowered(pos) && world.isBlockPresent(pos.down()) && blockBelowIsHot();
|
||||||
if (shouldGenerate == isGenerator)
|
if (shouldGenerate == isGenerator)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
isGenerator = shouldGenerate;
|
isGenerator = shouldGenerate;
|
||||||
if (isGenerator)
|
if (isGenerator) {
|
||||||
|
notifyStressCapacityChange(getAddedStressCapacity());
|
||||||
removeSource();
|
removeSource();
|
||||||
|
} else {
|
||||||
|
notifyStressCapacityChange(0);
|
||||||
|
}
|
||||||
applyNewSpeed(isGenerator ? CreateConfig.parameters.generatingFanSpeed.get() : 0);
|
applyNewSpeed(isGenerator ? CreateConfig.parameters.generatingFanSpeed.get() : 0);
|
||||||
sendData();
|
sendData();
|
||||||
}
|
}
|
||||||
|
@ -182,8 +191,16 @@ public class EncasedFanTileEntity extends KineticTileEntity implements ITickable
|
||||||
updateFrontBlock();
|
updateFrontBlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reActivateSource() {
|
||||||
|
source = Optional.empty();
|
||||||
|
applyNewSpeed(isGenerator ? CreateConfig.parameters.generatingFanSpeed.get() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
|
super.tick();
|
||||||
|
|
||||||
if (speed == 0 || isGenerator)
|
if (speed == 0 || isGenerator)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,6 @@ import net.minecraft.item.crafting.ShapelessRecipe;
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
import net.minecraft.particles.ItemParticleData;
|
import net.minecraft.particles.ItemParticleData;
|
||||||
import net.minecraft.particles.ParticleTypes;
|
import net.minecraft.particles.ParticleTypes;
|
||||||
import net.minecraft.tileentity.ITickableTileEntity;
|
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.Direction.Axis;
|
import net.minecraft.util.Direction.Axis;
|
||||||
import net.minecraft.util.NonNullList;
|
import net.minecraft.util.NonNullList;
|
||||||
|
@ -35,7 +34,7 @@ import net.minecraftforge.items.IItemHandler;
|
||||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||||
import net.minecraftforge.items.ItemHandlerHelper;
|
import net.minecraftforge.items.ItemHandlerHelper;
|
||||||
|
|
||||||
public class MechanicalMixerTileEntity extends KineticTileEntity implements ITickableTileEntity {
|
public class MechanicalMixerTileEntity extends KineticTileEntity {
|
||||||
|
|
||||||
public int runningTicks;
|
public int runningTicks;
|
||||||
public int processingTicks;
|
public int processingTicks;
|
||||||
|
@ -132,6 +131,7 @@ public class MechanicalMixerTileEntity extends KineticTileEntity implements ITic
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
|
super.tick();
|
||||||
|
|
||||||
if (world.isRemote && lastModified != -1) {
|
if (world.isRemote && lastModified != -1) {
|
||||||
if (lastModified++ > 10) {
|
if (lastModified++ > 10) {
|
||||||
|
|
|
@ -13,7 +13,6 @@ import net.minecraft.entity.item.ItemEntity;
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
import net.minecraft.particles.ItemParticleData;
|
import net.minecraft.particles.ItemParticleData;
|
||||||
import net.minecraft.particles.ParticleTypes;
|
import net.minecraft.particles.ParticleTypes;
|
||||||
import net.minecraft.tileentity.ITickableTileEntity;
|
|
||||||
import net.minecraft.util.SoundCategory;
|
import net.minecraft.util.SoundCategory;
|
||||||
import net.minecraft.util.SoundEvents;
|
import net.minecraft.util.SoundEvents;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
|
@ -22,7 +21,7 @@ import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraftforge.items.ItemStackHandler;
|
import net.minecraftforge.items.ItemStackHandler;
|
||||||
import net.minecraftforge.items.wrapper.RecipeWrapper;
|
import net.minecraftforge.items.wrapper.RecipeWrapper;
|
||||||
|
|
||||||
public class MechanicalPressTileEntity extends KineticTileEntity implements ITickableTileEntity {
|
public class MechanicalPressTileEntity extends KineticTileEntity {
|
||||||
|
|
||||||
public static class PressingInv extends RecipeWrapper {
|
public static class PressingInv extends RecipeWrapper {
|
||||||
public PressingInv() {
|
public PressingInv() {
|
||||||
|
@ -85,6 +84,8 @@ public class MechanicalPressTileEntity extends KineticTileEntity implements ITic
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
|
super.tick();
|
||||||
|
|
||||||
if (!running)
|
if (!running)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package com.simibubi.create.modules.contraptions.receivers.constructs;
|
package com.simibubi.create.modules.contraptions.receivers.constructs;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import com.simibubi.create.AllTileEntities;
|
import com.simibubi.create.AllTileEntities;
|
||||||
import com.simibubi.create.modules.contraptions.RotationPropagator;
|
import com.simibubi.create.modules.contraptions.RotationPropagator;
|
||||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||||
|
@ -8,7 +10,6 @@ import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
import net.minecraft.state.properties.BlockStateProperties;
|
import net.minecraft.state.properties.BlockStateProperties;
|
||||||
import net.minecraft.tileentity.ITickableTileEntity;
|
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
|
@ -18,7 +19,7 @@ import net.minecraft.world.gen.feature.template.Template.BlockInfo;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||||
|
|
||||||
public class MechanicalBearingTileEntity extends KineticTileEntity implements ITickableTileEntity {
|
public class MechanicalBearingTileEntity extends KineticTileEntity {
|
||||||
|
|
||||||
protected RotationConstruct movingConstruct;
|
protected RotationConstruct movingConstruct;
|
||||||
protected float angle;
|
protected float angle;
|
||||||
|
@ -41,6 +42,11 @@ public class MechanicalBearingTileEntity extends KineticTileEntity implements IT
|
||||||
public double getMaxRenderDistanceSquared() {
|
public double getMaxRenderDistanceSquared() {
|
||||||
return super.getMaxRenderDistanceSquared() * 16;
|
return super.getMaxRenderDistanceSquared() * 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getAddedStressCapacity() {
|
||||||
|
return getWindmillSpeed() * 50;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isSource() {
|
public boolean isSource() {
|
||||||
|
@ -144,10 +150,16 @@ public class MechanicalBearingTileEntity extends KineticTileEntity implements IT
|
||||||
getWorld().setBlockState(info.pos.add(pos), Blocks.AIR.getDefaultState(), 67);
|
getWorld().setBlockState(info.pos.add(pos), Blocks.AIR.getDefaultState(), 67);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
applyWindmillSpeed();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void applyWindmillSpeed() {
|
||||||
if (isWindmill) {
|
if (isWindmill) {
|
||||||
RotationPropagator.handleRemoved(world, pos, this);
|
RotationPropagator.handleRemoved(world, pos, this);
|
||||||
|
source = Optional.empty();
|
||||||
speed = getWindmillSpeed();
|
speed = getWindmillSpeed();
|
||||||
RotationPropagator.handleAdded(world, pos, this);
|
RotationPropagator.handleAdded(world, pos, this);
|
||||||
|
sendData();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,9 +188,16 @@ public class MechanicalBearingTileEntity extends KineticTileEntity implements IT
|
||||||
angle = 0;
|
angle = 0;
|
||||||
sendData();
|
sendData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reActivateSource() {
|
||||||
|
applyWindmillSpeed();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
|
super.tick();
|
||||||
|
|
||||||
if (running && RotationConstruct.isFrozen())
|
if (running && RotationConstruct.isFrozen())
|
||||||
disassembleConstruct();
|
disassembleConstruct();
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,6 @@ import com.simibubi.create.modules.contraptions.receivers.constructs.MechanicalP
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
import net.minecraft.state.properties.BlockStateProperties;
|
import net.minecraft.state.properties.BlockStateProperties;
|
||||||
import net.minecraft.tileentity.ITickableTileEntity;
|
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.Direction.Axis;
|
import net.minecraft.util.Direction.Axis;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
|
@ -30,7 +29,7 @@ import net.minecraft.world.gen.feature.template.Template.BlockInfo;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||||
|
|
||||||
public class MechanicalPistonTileEntity extends KineticTileEntity implements ITickableTileEntity {
|
public class MechanicalPistonTileEntity extends KineticTileEntity {
|
||||||
|
|
||||||
protected PistonContraption movedContraption;
|
protected PistonContraption movedContraption;
|
||||||
protected float offset;
|
protected float offset;
|
||||||
|
@ -189,6 +188,8 @@ public class MechanicalPistonTileEntity extends KineticTileEntity implements ITi
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
|
super.tick();
|
||||||
|
|
||||||
if (!world.isRemote && assembleNextTick) {
|
if (!world.isRemote && assembleNextTick) {
|
||||||
assembleNextTick = false;
|
assembleNextTick = false;
|
||||||
if (running) {
|
if (running) {
|
||||||
|
|
|
@ -33,7 +33,7 @@ public class GearboxTileEntityRenderer extends KineticTileEntityRenderer {
|
||||||
float offset = getRotationOffsetForPosition(te, pos, axis);
|
float offset = getRotationOffsetForPosition(te, pos, axis);
|
||||||
float angle = (time * te.getSpeed()) % 360;
|
float angle = (time * te.getSpeed()) % 360;
|
||||||
|
|
||||||
if (te.getSpeed() != 0) {
|
if (te.getSpeed() != 0 && te.hasSource()) {
|
||||||
BlockPos source = te.getSource().subtract(te.getPos());
|
BlockPos source = te.getSource().subtract(te.getPos());
|
||||||
Direction sourceFacing = Direction.getFacingFromVector(source.getX(), source.getY(), source.getZ());
|
Direction sourceFacing = Direction.getFacingFromVector(source.getX(), source.getY(), source.getZ());
|
||||||
if (sourceFacing.getAxis() == direction.getAxis())
|
if (sourceFacing.getAxis() == direction.getAxis())
|
||||||
|
|
|
@ -183,7 +183,7 @@ public class BeltItem extends Item {
|
||||||
|
|
||||||
float speed1 = ((KineticTileEntity) world.getTileEntity(first)).getSpeed();
|
float speed1 = ((KineticTileEntity) world.getTileEntity(first)).getSpeed();
|
||||||
float speed2 = ((KineticTileEntity) world.getTileEntity(second)).getSpeed();
|
float speed2 = ((KineticTileEntity) world.getTileEntity(second)).getSpeed();
|
||||||
if (speed1 != speed2 && speed1 != 0 && speed2 != 0)
|
if (Math.signum(speed1) != Math.signum(speed2) && speed1 != 0 && speed2 != 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
BlockPos step = new BlockPos(Math.signum(diff.getX()), Math.signum(diff.getY()), Math.signum(diff.getZ()));
|
BlockPos step = new BlockPos(Math.signum(diff.getX()), Math.signum(diff.getY()), Math.signum(diff.getZ()));
|
||||||
|
|
|
@ -26,7 +26,6 @@ import net.minecraft.nbt.NBTUtil;
|
||||||
import net.minecraft.potion.EffectInstance;
|
import net.minecraft.potion.EffectInstance;
|
||||||
import net.minecraft.potion.Effects;
|
import net.minecraft.potion.Effects;
|
||||||
import net.minecraft.state.properties.BlockStateProperties;
|
import net.minecraft.state.properties.BlockStateProperties;
|
||||||
import net.minecraft.tileentity.ITickableTileEntity;
|
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.Direction.Axis;
|
import net.minecraft.util.Direction.Axis;
|
||||||
|
@ -36,7 +35,7 @@ import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.util.math.Vec3i;
|
import net.minecraft.util.math.Vec3i;
|
||||||
|
|
||||||
public class BeltTileEntity extends KineticTileEntity implements ITickableTileEntity {
|
public class BeltTileEntity extends KineticTileEntity {
|
||||||
|
|
||||||
protected BlockPos controller;
|
protected BlockPos controller;
|
||||||
public Map<Entity, TransportedEntityInfo> passengers;
|
public Map<Entity, TransportedEntityInfo> passengers;
|
||||||
|
@ -140,6 +139,8 @@ public class BeltTileEntity extends KineticTileEntity implements ITickableTileEn
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
|
super.tick();
|
||||||
|
|
||||||
if (world != null && trackerUpdateTag != null) {
|
if (world != null && trackerUpdateTag != null) {
|
||||||
attachmentTracker.readAndSearch(trackerUpdateTag, this);
|
attachmentTracker.readAndSearch(trackerUpdateTag, this);
|
||||||
trackerUpdateTag = null;
|
trackerUpdateTag = null;
|
||||||
|
|
|
@ -50,12 +50,12 @@ public class FrequencyHandler {
|
||||||
|
|
||||||
public void onLoadWorld(IWorld world) {
|
public void onLoadWorld(IWorld world) {
|
||||||
connections.put(world, new HashMap<>());
|
connections.put(world, new HashMap<>());
|
||||||
Create.logger.debug("Prepared Network Space for " + world.getDimension().getType().getRegistryName());
|
Create.logger.debug("Prepared Redstone Network Space for " + world.getDimension().getType().getRegistryName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onUnloadWorld(IWorld world) {
|
public void onUnloadWorld(IWorld world) {
|
||||||
connections.remove(world);
|
connections.remove(world);
|
||||||
Create.logger.debug("Removed Network Space for " + world.getDimension().getType().getRegistryName());
|
Create.logger.debug("Removed Redstone Network Space for " + world.getDimension().getType().getRegistryName());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Pair<Frequency, Frequency> getNetworkKey(IHaveWireless actor) {
|
private static Pair<Frequency, Frequency> getNetworkKey(IHaveWireless actor) {
|
||||||
|
|
BIN
src/main/resources/assets/create/textures/block/scarf.png
Normal file
BIN
src/main/resources/assets/create/textures/block/scarf.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 441 B |
BIN
src/main/resources/assets/create/textures/gui/filter.pdn
Normal file
BIN
src/main/resources/assets/create/textures/gui/filter.pdn
Normal file
Binary file not shown.
Loading…
Reference in a new issue