Skip to content

Commit ad2c259

Browse files
author
Circulate233
committed
功能性完善
1 parent a5ae48e commit ad2c259

File tree

10 files changed

+130
-22
lines changed

10 files changed

+130
-22
lines changed
Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,50 @@
11
package github.kasuminova.novaeng.common.block;
22

3+
import github.kasuminova.novaeng.NovaEngineeringCore;
4+
import github.kasuminova.novaeng.common.core.CreativeTabNovaEng;
35
import github.kasuminova.novaeng.common.tile.TileDreamEnergyPort;
46
import net.minecraft.block.state.IBlockState;
7+
import net.minecraft.client.resources.I18n;
8+
import net.minecraft.client.util.ITooltipFlag;
9+
import net.minecraft.item.ItemStack;
510
import net.minecraft.tileentity.TileEntity;
611
import net.minecraft.world.World;
12+
import net.minecraftforge.fml.relauncher.Side;
13+
import net.minecraftforge.fml.relauncher.SideOnly;
714
import sonar.fluxnetworks.common.block.BlockFluxStorage;
15+
import sonar.fluxnetworks.common.registry.RegistryBlocks;
16+
import sonar.fluxnetworks.common.registry.RegistryItems;
817

918
import javax.annotation.Nullable;
19+
import java.util.List;
1020

1121
public class BlockDreamEnergyPort extends BlockFluxStorage {
1222
public static final BlockDreamEnergyPort INSTANCE = new BlockDreamEnergyPort();
1323

14-
public BlockDreamEnergyPort() {
24+
private BlockDreamEnergyPort() {
1525
super("DreamEnergyPort");
26+
this.setTranslationKey(NovaEngineeringCore.MOD_ID + '.' + "dream_energy_port");
27+
this.setCreativeTab(CreativeTabNovaEng.INSTANCE);
28+
RegistryBlocks.BLOCKS.remove(this);
29+
RegistryItems.ITEMS.remove(RegistryItems.ITEMS.size() - 1);
1630
}
1731

1832
@Nullable
33+
@Override
1934
public TileEntity createTileEntity(World world, IBlockState state) {
2035
return new TileDreamEnergyPort();
2136
}
2237

38+
@Override
2339
public int getMaxStorage() {
2440
return Integer.MAX_VALUE;
2541
}
42+
43+
@Override
44+
@SideOnly(Side.CLIENT)
45+
public void addInformation(ItemStack stack, @Nullable World player, List<String> tooltip, ITooltipFlag advanced) {
46+
super.addInformation(stack, player, tooltip, advanced);
47+
tooltip.add(I18n.format("text.dream_energy_port.0"));
48+
tooltip.add(I18n.format("text.dream_energy_port.1"));
49+
}
2650
}

src/main/java/github/kasuminova/novaeng/common/handler/DreamEnergyPortHandler.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import sonar.fluxnetworks.common.tileentity.TileFluxStorage;
1111

1212
public class DreamEnergyPortHandler extends BasicTransferHandler<TileDreamEnergyPort> {
13-
private long added;
1413
private long removed;
1514
private BlockPos ctrlPos;
1615
private World world;
@@ -36,9 +35,11 @@ public void onCycleStart() {
3635

3736
@Override
3837
public void onCycleEnd() {
39-
this.change = this.added - this.removed;
40-
this.added = 0L;
4138
this.removed = 0L;
39+
if (this.buffer > 0){
40+
this.addToBuffer(this.buffer);
41+
this.buffer = 0L;
42+
}
4243
}
4344

4445
@Override
@@ -49,17 +50,16 @@ public void updateTransfers(EnumFacing... enumFacings) {
4950
public void addToBuffer(long energy) {
5051
if (energy > 0L) {
5152
DreamEnergyCore.receiveEnergy(getCtrl(),1,energy);
52-
this.added += energy;
5353
((TileFluxStorage)this.device).markServerEnergyChanged();
5454
}
5555
}
5656

5757
public long removeFromBuffer(long energy) {
58-
long a = Math.min(Math.min(energy, this.getBuffer()), ((TileFluxStorage)this.device).getLogicLimit() - this.removed);
58+
long a = Math.min(Math.min(energy, this.getBuffer()), Math.max(Long.MAX_VALUE - this.removed,0));
5959
if (a <= 0L) {
6060
return 0L;
6161
} else {
62-
DreamEnergyCore.extractEnergy(getCtrl(),1,energy);
62+
DreamEnergyCore.extractEnergy(getCtrl(),1,a);
6363
this.removed += a;
6464
((TileFluxStorage)this.device).markServerEnergyChanged();
6565
return a;
@@ -75,7 +75,7 @@ public long getRequest() {
7575
}
7676

7777
public TileMultiblockMachineController getCtrl(){
78-
if (ctrlPos == null){
78+
if (ctrlPos == null || this.world == null){
7979
return null;
8080
}
8181
if (this.world.getTileEntity(ctrlPos) instanceof TileMultiblockMachineController ctrl) {

src/main/java/github/kasuminova/novaeng/common/machine/DreamEnergyCore.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class DreamEnergyCore implements MachineSpecial{
4343
private static float minSpeed = 0.01f;
4444
//最大传输速度,按倍计。
4545
private static int maxSpeed = 100000;
46-
//基础输入输出速度。能量输入输出速度计算方法为defaultTransferAmount * speed,其中 speed 可由玩家控制。
46+
//基础输入输出速度。能量输入输出速度计算方法为:defaultTransferAmount * speed,其中 speed 可由玩家控制。
4747
private static long defaultTransferAmount = 100000000;
4848

4949
private static IBlockPos facePos;
@@ -105,6 +105,9 @@ public void SInit(DynamicMachine machine){
105105
}
106106
if (ctrl.getWorld().getTileEntity(facePos) instanceof TileDreamEnergyPort tdep){
107107
tdep.setCtrlPos(ctrl.getPos());
108+
ctrl.getCustomDataTag().setBoolean("wireless",true);
109+
} else {
110+
ctrl.getCustomDataTag().setBoolean("wireless",false);
108111
}
109112
});
110113
var inputThreadName = "梦之收集者";
@@ -124,6 +127,10 @@ public void SInit(DynamicMachine machine){
124127
var data = ctrl.getCustomDataTag();
125128
var speed = Math.max(1.0f,data.getFloat("speed"));
126129
var energy = data.hasKey("energyStored") ? "0" : data.getString("energyStored");
130+
if (data.getBoolean("wireless")){
131+
event.setFailed("当前处于通量模式");
132+
return;
133+
}
127134
if (!canExtract(data, speed)) {
128135
event.setFailed("内部能量储量不足!");
129136
return;
@@ -145,6 +152,11 @@ public void SInit(DynamicMachine machine){
145152
// 输入配方
146153
RecipeBuilder.newBuilder("receive", MachineID, 1, 2, true)
147154
.addEnergyPerTickInput(defaultTransferAmount)
155+
.addPreCheckHandler(event -> {
156+
if (event.getController().getCustomDataTag().getBoolean("wireless")){
157+
event.setFailed("当前处于通量模式");
158+
}
159+
})
148160
.addFactoryPreTickHandler(event -> {
149161
var ctrl = event.getController();
150162
var data = ctrl.getCustomDataTag();
@@ -180,9 +192,9 @@ public void CInit(DynamicMachine machine){
180192

181193
String[] info = {
182194
"§b/////////// 梦之管理者 ///////////",
183-
"§b能量储存§a" + formatNumber(getBigInt(energyStored)) + " RF",
184-
"§b输入输出值:§a" + formatNumber((long) (defaultTransferAmount * speed),1) + " RF/t",
185-
"§b一分钟内平均交互速度§a" + change(ctrl) + " RF/t",
195+
"§b能量储存:§a" + formatNumber(getBigInt(energyStored)) + " RF",
196+
data.getBoolean("wireless") ? "§b输入输出速度:#FF6347-FFA54F-FFFF00-7FFF00-40E0D0-00BFFFInfinity" : "§b输入输出速度:§a" + formatNumber((long) (defaultTransferAmount * speed),1) + " RF/t",
197+
"§b一分钟内平均交互速度:§a" + change(ctrl) + " RF/t",
186198
"§b///////////////////////////////////"
187199
};
188200

@@ -211,9 +223,9 @@ private static boolean canExtract(NBTTagCompound nbt,float speed){
211223
/**
212224
* 将能量存储进控制器内部。
213225
*/
214-
private static void receiveEnergy(NBTTagCompound nbt,float speed,long defaultTransferAmount) {
226+
public static void receiveEnergy(NBTTagCompound nbt,float speed,long defaultTransferAmount) {
215227
var energyStored = getEnergyStored(nbt);
216-
var sz = BigInteger.valueOf((long) (speed * defaultTransferAmount));
228+
var sz = getBigInt(Long.toString((long) (speed * defaultTransferAmount)));
217229

218230
nbt.setString("energyStored",energyStored.add(sz).toString());
219231
if (ENERGY_STORED_CACHE.size() > 3000) {
@@ -224,9 +236,9 @@ private static void receiveEnergy(NBTTagCompound nbt,float speed,long defaultTra
224236
/**
225237
* 提取控制器内部能量至能量输出仓。
226238
*/
227-
private static void extractEnergy(NBTTagCompound nbt,float speed,long defaultTransferAmount) {
239+
public static void extractEnergy(NBTTagCompound nbt,float speed,long defaultTransferAmount) {
228240
var energyStored = getEnergyStored(nbt);
229-
var sz = BigInteger.valueOf((long) (speed * defaultTransferAmount));
241+
var sz = getBigInt(Long.toString((long) (speed * defaultTransferAmount)));
230242

231243
nbt.setString("energyStored",energyStored.subtract(sz).toString());
232244
if (ENERGY_STORED_CACHE.size() > 3000) {
@@ -238,6 +250,7 @@ public static BigInteger getEnergyStored(NBTTagCompound nbt){
238250
return nbt.hasKey("energyStored") ? getBigInt(nbt.getString("energyStored")) : BigInteger.ZERO;
239251
}
240252

253+
@ZenMethod
241254
public static BigInteger getEnergyStored(IMachineController ctrl){
242255
return getEnergyStored(ctrl.getController().getCustomDataTag());
243256
}

src/main/java/github/kasuminova/novaeng/common/tile/TileDreamEnergyPort.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ public BlockPos getCtrlPos() {
2525
public TileDreamEnergyPort() {
2626
this.customName = "Dream Energy Port";
2727
this.limit = (long) FluxConfig.gargantuanTransfer;
28-
this.handler = new DreamEnergyPortHandler(this);
2928
this.stack = new ItemStack(BlockDreamEnergyPort.INSTANCE);
29+
this.handler = new DreamEnergyPortHandler(this);
3030
}
3131

3232
@Override
@@ -52,11 +52,18 @@ public NBTTagCompound writeToNBT(NBTTagCompound compound) {
5252
return compound;
5353
}
5454

55+
@Override
56+
public int getLogicPriority() {
57+
return this.surgeMode ? -100000 : Math.min(this.priority - 1000000, -100000);
58+
}
59+
5560
@Override
5661
public void readFromNBT(NBTTagCompound compound) {
5762
super.readFromNBT(compound);
5863
if (compound.hasKey("ctrlPos")){
5964
this.ctrlPos = BlockPos.fromLong(compound.getLong("ctrlPos"));
65+
this.handler.setCtrlPos(this.ctrlPos);
66+
this.handler.setWorld(this.world);
6067
}
6168
}
6269

@@ -66,6 +73,9 @@ public ITransferHandler getTransferHandler() {
6673
}
6774

6875
public boolean getCtrlStructureFormed(){
76+
if (this.ctrlPos == null){
77+
return false;
78+
}
6979
if (this.world.getTileEntity(ctrlPos) instanceof TileMultiblockMachineController ctrl) {
7080
if (ctrl.getFoundMachine() != null && ctrl.getFoundMachine().getRegistryName().equals(DreamEnergyCore.REGISTRY_NAME)){
7181
return ctrl.isStructureFormed();

src/main/java/github/kasuminova/novaeng/common/util/IBlockPosEx.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ public static BlockPos createPosByFacing(BlockPos instance, EnumFacing facing, i
2424
var z = instance.getZ() + NorthZ;
2525
return switch (facing) {
2626
case SOUTH -> new BlockPos(-x,y,-z);
27+
case NORTH -> new BlockPos(x,y,z);
2728
case EAST -> new BlockPos(-z,y,x);
2829
case WEST -> new BlockPos(z,y,-x);
2930
case UP -> new BlockPos(x,-z,y);
3031
case DOWN -> new BlockPos(x,z,y);
31-
case NORTH -> new BlockPos(x,y,z);
3232
};
3333
}
3434

src/main/java/github/kasuminova/novaeng/mixin/codechickenlib/MixinReflectionManager.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import codechicken.lib.reflect.ReflectionManager;
44
import org.spongepowered.asm.mixin.Mixin;
5-
import org.spongepowered.asm.mixin.Overwrite;
65
import org.spongepowered.asm.mixin.Shadow;
6+
import org.spongepowered.asm.mixin.injection.At;
7+
import org.spongepowered.asm.mixin.injection.Inject;
8+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
79

810
import java.lang.reflect.Field;
911

@@ -22,8 +24,8 @@ public static Class<?> findClass(String name) {
2224
* @author circulation
2325
* @reason 防止无限递归的出现
2426
*/
25-
@Overwrite
26-
public static void removeFinal(Field field) {
27+
@Inject(method = "removeFinal",at = @At("HEAD"), cancellable = true)
28+
private static void removeFinal(Field field, CallbackInfo ci) {
2729
if ((field.getModifiers() & 16) != 0) {
2830
try {
2931
if (modifiersField == null) {
@@ -36,5 +38,6 @@ public static void removeFinal(Field field) {
3638
throw new RuntimeException(e);
3739
}
3840
}
41+
ci.cancel();
3942
}
4043
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package github.kasuminova.novaeng.mixin.fluxnetworks;
2+
3+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
5+
import github.kasuminova.novaeng.common.handler.DreamEnergyPortHandler;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.Shadow;
8+
import org.spongepowered.asm.mixin.Unique;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
import org.spongepowered.asm.mixin.injection.Inject;
11+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12+
import sonar.fluxnetworks.api.network.FluxLogicType;
13+
import sonar.fluxnetworks.api.network.ITransferHandler;
14+
import sonar.fluxnetworks.api.tiles.IFluxConnector;
15+
import sonar.fluxnetworks.common.connection.FluxNetworkBase;
16+
import sonar.fluxnetworks.common.connection.FluxNetworkServer;
17+
import sonar.fluxnetworks.common.connection.NetworkStatistics;
18+
19+
import javax.annotation.Nonnull;
20+
import java.util.List;
21+
22+
@Mixin(value = FluxNetworkServer.class,remap = false)
23+
public abstract class MixinFluxNetworkServer extends FluxNetworkBase {
24+
25+
@Shadow
26+
public long bufferLimiter;
27+
28+
@Shadow
29+
@Nonnull
30+
public abstract <T extends IFluxConnector> List<T> getConnections(FluxLogicType type);
31+
32+
@Unique
33+
private ITransferHandler novaEngineering_Core$instance;
34+
35+
@WrapOperation(method = "onEndServerTick", at = @At(value = "INVOKE", target = "Lsonar/fluxnetworks/api/network/ITransferHandler;getRequest()J",ordinal = 1))
36+
public long getRequestMixin(ITransferHandler instance, Operation<Long> original) {
37+
this.novaEngineering_Core$instance = instance;
38+
return original.call(instance);
39+
}
40+
41+
@Inject(method = "onEndServerTick", at = @At(value = "INVOKE", target = "Lsonar/fluxnetworks/api/network/ITransferHandler;getRequest()J",ordinal = 1,shift = At.Shift.AFTER), cancellable = true)
42+
public void getRequestI(CallbackInfo ci) {
43+
if (novaEngineering_Core$instance instanceof DreamEnergyPortHandler){
44+
this.bufferLimiter = Long.MAX_VALUE;
45+
((NetworkStatistics)this.network_stats.getValue()).stopProfiling();
46+
ci.cancel();
47+
}
48+
}
49+
}

src/main/resources/assets/novaeng_core/lang/en_US.lang

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ top.ecalculator.thread_core.avg_parallelism=§9平均并行数:
214214
top.ecalculator.thread_core.avg_time_usage=§b平均性能使用:
215215

216216
tile.novaeng_core.redstone_logical_port.name=红石逻辑端口
217+
tile.novaeng_core.dream_energy_port.name=通量交互端口
217218

218219
tile.novaeng_core.hypernet_terminal_controller.name=HyperNet 网络终端
219220
tile.novaeng_core.modular_server_assembler.name=模块服务器组装台(未实装)
@@ -539,6 +540,9 @@ gui.geocentric_drill.ore_control.tooltip.chance=输出权重:§a%s%%§f
539540
gui.novaeng_core.replicator=可复制列表
540541
gui.novaeng_core.replicator.tooltips1=需要%sB UU物质复制
541542

543+
text.dream_energy_port.0="替换梦之能量核心的智能数据接口以启用通量模式"
544+
text.dream_energy_port.1="通量模式下,梦之能量核心将直接作为通量网络缓存"
545+
542546
enchantment.magic_breaking=破魔
543547
enchantment.novaeng_core.magic_breaking.desc=对于剩余血量大于10的生物,你的每一次伤害都将是真实的(无视免伤和护甲),但你无法一次击杀它们
544548
modifier.magic_breaking.name=破魔

src/main/resources/assets/novaeng_core/lang/zh_CN.lang

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ top.ecalculator.thread_core.avg_parallelism=§9平均并行数:
214214
top.ecalculator.thread_core.avg_time_usage=§b平均性能使用:
215215

216216
tile.novaeng_core.redstone_logical_port.name=红石逻辑端口
217+
tile.novaeng_core.dream_energy_port.name=通量交互端口
217218

218219
tile.novaeng_core.hypernet_terminal_controller.name=HyperNet 网络终端
219220
tile.novaeng_core.modular_server_assembler.name=模块服务器组装台(未实装)
@@ -539,6 +540,9 @@ gui.geocentric_drill.ore_control.tooltip.chance=输出权重:§a%s%%§f
539540
gui.novaeng_core.replicator=可复制列表
540541
gui.novaeng_core.replicator.tooltips1=需要%sB UU物质复制
541542

543+
text.dream_energy_port.0="替换梦之能量核心的智能数据接口以启用通量模式"
544+
text.dream_energy_port.1="通量模式下,梦之能量核心将直接作为通量网络缓存"
545+
542546
enchantment.magic_breaking=破魔
543547
enchantment.novaeng_core.magic_breaking.desc=对于剩余血量大于10的生物,你的每一次伤害都将是真实的(无视免伤和护甲),但你无法一次击杀它们
544548
modifier.magic_breaking.name=破魔

src/main/resources/mixins.novaeng_core_fluxnetworks.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"client": [
88
],
99
"mixins": [
10-
"MixinBasicTransferHandler"
10+
"MixinBasicTransferHandler",
11+
"MixinFluxNetworkServer"
1112
]
1213
}

0 commit comments

Comments
 (0)