Skip to content

Commit

Permalink
试图添加集电器集电粒子 #696
Browse files Browse the repository at this point in the history
  • Loading branch information
ZhuRuoLing committed Sep 30, 2024
1 parent d6bd93d commit cb3e698
Show file tree
Hide file tree
Showing 7 changed files with 176 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ private void charge(int chargeNum, BlockPos blockPos) {
for (ChargeCollectorManager.Entry entry : chargeCollectorCollection) {
ChargeCollectorBlockEntity chargeCollectorBlockEntity = entry.getBlockEntity();
if (!ChargeCollectorManager.getInstance(level).canCollect(chargeCollectorBlockEntity, blockPos)) return;
surplus = chargeCollectorBlockEntity.incomingCharge(surplus);
surplus = chargeCollectorBlockEntity.incomingCharge(surplus, blockPos);
if (surplus == 0) return;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ private void charge(int chargeNum, Level level, BlockPos blockPos) {
for (Entry entry : chargeCollectorCollection) {
ChargeCollectorBlockEntity chargeCollectorBlockEntity = entry.getBlockEntity();
if (!ChargeCollectorManager.getInstance(level).canCollect(chargeCollectorBlockEntity, blockPos)) return;
surplus = chargeCollectorBlockEntity.incomingCharge(surplus);
surplus = chargeCollectorBlockEntity.incomingCharge(surplus, blockPos);
if (surplus == 0) return;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@
import dev.dubhe.anvilcraft.api.tooltip.providers.IHasAffectRange;
import dev.dubhe.anvilcraft.init.ModBlockEntities;

import dev.dubhe.anvilcraft.network.ChargeCollectorIncomingChargePacket;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;

import net.neoforged.neoforge.network.PacketDistributor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand Down Expand Up @@ -90,13 +93,23 @@ public void tick() {
* @param num 添加至收集器的电荷数
* @return 溢出的电荷数(既未被添加至收集器的电荷数)
*/
public double incomingCharge(double num) {
double surplus = num - (MAX_POWER_PER_INCOMING - this.chargeNum);
if (surplus < 0) {
surplus = 0;
public double incomingCharge(double num, BlockPos srcPos) {
double overflow = num - (MAX_POWER_PER_INCOMING - this.chargeNum);
if (overflow < 0) {
overflow = 0;
}
this.chargeNum += num - surplus;
return surplus;
double acceptableChargeCount = num - overflow;
PacketDistributor.sendToPlayersTrackingChunk(
(ServerLevel) level,
level.getChunkAt(worldPosition).getPos(),
new ChargeCollectorIncomingChargePacket(
srcPos,
this.worldPosition,
acceptableChargeCount
)
);
this.chargeNum += acceptableChargeCount;
return overflow;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ private void lightningCharge(BlockPos pos, Level level, BlockState state) {
for (var floatChargeCollectorBlockEntityEntry : nearestChargeCollect) {
ChargeCollectorBlockEntity blockEntity = floatChargeCollectorBlockEntityEntry.getBlockEntity();
if (ChargeCollectorManager.getInstance(level).canCollect(blockEntity, pos)) {
unCharged = blockEntity.incomingCharge(unCharged);
unCharged = blockEntity.incomingCharge(unCharged, pos);
if (unCharged <= 0) break;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public static void onPistonMoveBlocks(@NotNull Level level, @NotNull List<BlockP
for (var floatChargeCollectorBlockEntityEntry : nearestChargeCollect) {
ChargeCollectorBlockEntity blockEntity = floatChargeCollectorBlockEntityEntry.getBlockEntity();
if (ChargeCollectorManager.getInstance(level).canCollect(blockEntity, pos)) {
double unCharged = blockEntity.incomingCharge(n);
double unCharged = blockEntity.incomingCharge(n, pos);
if (unCharged == 0) {
break;
}
Expand Down
107 changes: 83 additions & 24 deletions src/main/java/dev/dubhe/anvilcraft/init/ModNetworks.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.dubhe.anvilcraft.init;

import dev.dubhe.anvilcraft.network.AddMutedSoundPacket;
import dev.dubhe.anvilcraft.network.ChargeCollectorIncomingChargePacket;
import dev.dubhe.anvilcraft.network.CyclingValueSyncPacket;
import dev.dubhe.anvilcraft.network.HammerUsePacket;
import dev.dubhe.anvilcraft.network.HeliostatsIrradiationPacket;
Expand All @@ -27,39 +28,97 @@ public class ModNetworks {
*/
public static void init(PayloadRegistrar registrar) {
registrar.playBidirectional(
MachineOutputDirectionPacket.TYPE,
MachineOutputDirectionPacket.STREAM_CODEC,
MachineOutputDirectionPacket.HANDLER);
MachineOutputDirectionPacket.TYPE,
MachineOutputDirectionPacket.STREAM_CODEC,
MachineOutputDirectionPacket.HANDLER
);
registrar.playBidirectional(
MachineEnableFilterPacket.TYPE,
MachineEnableFilterPacket.STREAM_CODEC,
MachineEnableFilterPacket.HANDLER);
MachineEnableFilterPacket.TYPE,
MachineEnableFilterPacket.STREAM_CODEC,
MachineEnableFilterPacket.HANDLER
);
registrar.playBidirectional(
SlotDisableChangePacket.TYPE, SlotDisableChangePacket.STREAM_CODEC, SlotDisableChangePacket.HANDLER);
SlotDisableChangePacket.TYPE,
SlotDisableChangePacket.STREAM_CODEC,
SlotDisableChangePacket.HANDLER
);
registrar.playBidirectional(
SlotFilterChangePacket.TYPE, SlotFilterChangePacket.STREAM_CODEC, SlotFilterChangePacket.HANDLER);
registrar.playToServer(SliderUpdatePacket.TYPE, SliderUpdatePacket.STREAM_CODEC, SliderUpdatePacket.HANDLER);
registrar.playToClient(SliderInitPacket.TYPE, SliderInitPacket.STREAM_CODEC, SliderInitPacket.HANDLER);
registrar.playToClient(PowerGridSyncPacket.TYPE, PowerGridSyncPacket.STREAM_CODEC, PowerGridSyncPacket.HANDLER);
SlotFilterChangePacket.TYPE,
SlotFilterChangePacket.STREAM_CODEC,
SlotFilterChangePacket.HANDLER
);
registrar.playToServer(
SliderUpdatePacket.TYPE,
SliderUpdatePacket.STREAM_CODEC,
SliderUpdatePacket.HANDLER
);
registrar.playToClient(
SliderInitPacket.TYPE,
SliderInitPacket.STREAM_CODEC,
SliderInitPacket.HANDLER);
registrar.playToClient(
PowerGridRemovePacket.TYPE, PowerGridRemovePacket.STREAM_CODEC, PowerGridRemovePacket.HANDLER);
registrar.playToServer(HammerUsePacket.TYPE, HammerUsePacket.STREAM_CODEC, HammerUsePacket.HANDLER);
PowerGridSyncPacket.TYPE,
PowerGridSyncPacket.STREAM_CODEC,
PowerGridSyncPacket.HANDLER);
registrar.playToClient(
PowerGridRemovePacket.TYPE,
PowerGridRemovePacket.STREAM_CODEC,
PowerGridRemovePacket.HANDLER
);
registrar.playToServer(
HammerUsePacket.TYPE,
HammerUsePacket.STREAM_CODEC,
HammerUsePacket.HANDLER
);
registrar.playToServer(
CyclingValueSyncPacket.TYPE, CyclingValueSyncPacket.STREAM_CODEC, CyclingValueSyncPacket.HANDLER);
registrar.playToClient(RocketJumpPacket.TYPE, RocketJumpPacket.STREAM_CODEC, RocketJumpPacket.HANDLER);
CyclingValueSyncPacket.TYPE,
CyclingValueSyncPacket.STREAM_CODEC,
CyclingValueSyncPacket.HANDLER
);
registrar.playToClient(
MutedSoundSyncPacket.TYPE, MutedSoundSyncPacket.STREAM_CODEC, MutedSoundSyncPacket.HANDLER);
registrar.playToServer(AddMutedSoundPacket.TYPE, AddMutedSoundPacket.STREAM_CODEC, AddMutedSoundPacket.HANDLER);
RocketJumpPacket.TYPE,
RocketJumpPacket.STREAM_CODEC,
RocketJumpPacket.HANDLER
);
registrar.playToClient(
MutedSoundSyncPacket.TYPE,
MutedSoundSyncPacket.STREAM_CODEC,
MutedSoundSyncPacket.HANDLER
);
registrar.playToServer(
AddMutedSoundPacket.TYPE,
AddMutedSoundPacket.STREAM_CODEC,
AddMutedSoundPacket.HANDLER
);
registrar.playToServer(
RemoveMutedSoundPacket.TYPE, RemoveMutedSoundPacket.STREAM_CODEC, RemoveMutedSoundPacket.HANDLER);
registrar.playToClient(LaserEmitPacket.TYPE, LaserEmitPacket.STREAM_CODEC, LaserEmitPacket.HANDLER);
RemoveMutedSoundPacket.TYPE,
RemoveMutedSoundPacket.STREAM_CODEC,
RemoveMutedSoundPacket.HANDLER
);
registrar.playToClient(
LaserEmitPacket.TYPE,
LaserEmitPacket.STREAM_CODEC,
LaserEmitPacket.HANDLER
);
registrar.playBidirectional(
HeliostatsIrradiationPacket.TYPE,
HeliostatsIrradiationPacket.STREAM_CODEC,
HeliostatsIrradiationPacket.HANDLER);
HeliostatsIrradiationPacket.TYPE,
HeliostatsIrradiationPacket.STREAM_CODEC,
HeliostatsIrradiationPacket.HANDLER
);
registrar.playToClient(
UpdateDisplayItemPacket.TYPE,
UpdateDisplayItemPacket.STREAM_CODEC,
UpdateDisplayItemPacket.HANDLER
);
registrar.playToClient(
UpdateDisplayItemPacket.TYPE, UpdateDisplayItemPacket.STREAM_CODEC, UpdateDisplayItemPacket.HANDLER);
StructureDataSyncPacket.TYPE,
StructureDataSyncPacket.STREAM_CODEC,
StructureDataSyncPacket.HANDLER
);
registrar.playToClient(
StructureDataSyncPacket.TYPE, StructureDataSyncPacket.STREAM_CODEC, StructureDataSyncPacket.HANDLER);
ChargeCollectorIncomingChargePacket.TYPE,
ChargeCollectorIncomingChargePacket.STREAM_CODEC,
ChargeCollectorIncomingChargePacket::acceptClient
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package dev.dubhe.anvilcraft.network;

import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import dev.dubhe.anvilcraft.AnvilCraft;
import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.util.RandomSource;
import net.minecraft.world.phys.Vec3;
import net.neoforged.neoforge.network.handling.IPayloadContext;

import java.util.Random;

@MethodsReturnNonnullByDefault
public record ChargeCollectorIncomingChargePacket(
BlockPos srcPos,
BlockPos dstPos,
double count
) implements CustomPacketPayload {
private static final Random RANDOM = new Random(System.nanoTime());
public static final Type<ChargeCollectorIncomingChargePacket> TYPE = new Type<>(AnvilCraft.of("incoming_charge"));

public static final Codec<ChargeCollectorIncomingChargePacket> CODEC = RecordCodecBuilder.create(ins -> ins.group(
BlockPos.CODEC.fieldOf("srcPos").forGetter(o -> o.srcPos),
BlockPos.CODEC.fieldOf("dstPos").forGetter(o -> o.dstPos),
Codec.DOUBLE.fieldOf("count").forGetter(o -> o.count)
).apply(ins, ChargeCollectorIncomingChargePacket::new));

public static final StreamCodec<? super RegistryFriendlyByteBuf, ChargeCollectorIncomingChargePacket> STREAM_CODEC =
StreamCodec.composite(
net.minecraft.core.BlockPos.STREAM_CODEC,
ChargeCollectorIncomingChargePacket::srcPos,
net.minecraft.core.BlockPos.STREAM_CODEC,
ChargeCollectorIncomingChargePacket::dstPos,
ByteBufCodecs.DOUBLE,
ChargeCollectorIncomingChargePacket::count,
ChargeCollectorIncomingChargePacket::new
);

@Override
public Type<? extends CustomPacketPayload> type() {
return TYPE;
}

public static void acceptClient(ChargeCollectorIncomingChargePacket packet, IPayloadContext ctx) {
ClientLevel level = Minecraft.getInstance().level;
Vec3 srcPos = packet.srcPos.getCenter();
Vec3 dstPos = packet.dstPos.getCenter();
Vec3 offset = dstPos.subtract(srcPos);
RANDOM.setSeed(System.nanoTime());
double dRandom = Math.clamp(RANDOM.nextGaussian() + 1, 1, 1.5);
level.addParticle(
ParticleTypes.END_ROD,
srcPos.x + Math.clamp(RANDOM.nextGaussian(), 0, 0.3),
srcPos.y + Math.clamp(RANDOM.nextGaussian(), 0, 0.3),
srcPos.z + Math.clamp(RANDOM.nextGaussian(), 0, 0.3),
(offset.x / 20d) * dRandom,
(offset.y / 20d) * dRandom,
(offset.z / 20d) * dRandom
);

}
}

0 comments on commit cb3e698

Please sign in to comment.