This commit is contained in:
HuTao今天吃什么 2022-09-09 20:35:48 +08:00
parent de6108e4ff
commit 6661c149e0
19 changed files with 310 additions and 240 deletions

View File

@ -18,7 +18,7 @@ a11e55f651479912f38def68d408d3365bff4e6b assets/extrabotany/blockstates/moonligh
5b4b6c301ff57c7d4006e79654cac0e1e68cbe60 assets/extrabotany/blockstates/serenitian.json
31853f21bb80a913ba27e5053a843459b3d7d37d assets/extrabotany/blockstates/sunshine_lily.json
3792750310ad34d765b0de88f50abf9bd23b365e assets/extrabotany/lang/en_us.json
ba11be396d6c0d323351b477bb498a87700b69f3 assets/extrabotany/lang/zh_cn.json
5125f587afab80295128b222491c9ac0565b1642 assets/extrabotany/lang/zh_cn.json
477b72a89fa3546590428dd7d8d4528c711a98dc assets/extrabotany/models/block/annoying_flower.json
2f2803ccc1532c712c13241790c9ec65fb61a97d assets/extrabotany/models/block/bell_flower.json
2cc688d6536ea214d2c83c83c2cf9be55b342b23 assets/extrabotany/models/block/bloody_enchantress.json

View File

@ -200,10 +200,10 @@
"extrabotany.page.ego4": "\u7B2C\u4E8C\u9636\u6BB5\u7684\u672C\u6211\u4F1A\u4F7F\u7528$(item)\u6CE2\u6D8C\u4E4B\u5203$(0)\u6216$(item)\u72C2\u661F\u4E4B\u6012$(0),\u540C\u65F6\u6BCF\u7D2F\u79EF\u4E00\u5B9A\u4F20\u9001\u6B21\u6570\u4F1A\u518D\u6B21\u53EC\u5524\u5730\u96F7\u9635\u3002\u5F53\u8840\u91CF\u4F4E\u4E8E\u4E00\u5B9A\u503C\u65F6\u4F1A\u8FDB\u5165\u7B2C\u4E09\u9636\u6BB5\uFF0C\u65E0\u654C\u3001\u56DE\u590D\u751F\u547D\u7684\u540C\u65F6\u4F1A\u53EC\u5524\u56DB\u4E2A\u4EC6\u4ECE\u653B\u51FB\u6311\u6218\u8005\u3002\u4EC6\u4ECE\u5206\u522B\u4F7F\u7528\u56DB\u79CD\u6B66\u5668\uFF0C\u63D0\u524D\u51FB\u8D25\u4EC6\u4ECE\u53EF\u4EE5\u63D0\u524D\u7ED3\u675F\u672C\u6211\u7684\u65E0\u654C\u72B6\u6001\u3002",
"extrabotany.page.ego5": "\u672C\u6211\u5728\u7B2C\u4E09\u9636\u6BB5\u53EA\u4F1A\u4F7F\u7528$(item)\u6700\u521D\u5206\u578B$(0)\u5BF9\u73A9\u5BB6\u8FDB\u884C\u653B\u51FB\uFF0C\u5176\u80FD\u529B\u503C\u5728\u8FD9\u4E00\u9636\u6BB5\u4F1A\u8FBE\u5230\u5CF0\u503C\u3002\u51FB\u8D25\u672C\u6211\u53EF\u4EE5\u5F97\u5230$(item)\u6F58\u591A\u62C9\u9B54\u76D2$(0)\uFF0C\u6253\u5F00\u5B83\u53EF\u4EE5\u83B7\u5F97\u4E30\u5BCC\u7684\u5956\u52B1\uFF0C\u5305\u542B\u4E00\u4E2A$(item)\u82F1\u96C4\u52CB\u7AE0$(0)\u3002",
"extrabotany.page.ego6": "\u81F3\u9AD8\u6559\u4E49",
"extrabotany.page.elementium_shield0": "\u4F7F\u7528\u66F4\u597D\u7684\u6750\u6599\u5236\u4F5C\u7684\u76FE\u724C\u5177\u6709\u66F4\u52A0\u7279\u6B8A\u7684\u80FD\u529B\u3002\u8FD9\u4E9B\u76FE\u724C\u5747\u80FD\u591F\u683C\u6321\u4E00\u4E9B$(thing)\u9057\u7269$(0)\u4EA7\u751F\u7684\u5F39\u5C04\u7269\u3002",
"extrabotany.page.elementium_shield0": "\u4F7F\u7528\u66F4\u597D\u7684\u6750\u6599\u5236\u4F5C\u7684\u76FE\u724C\u5177\u6709\u66F4\u52A0\u7279\u6B8A\u7684\u80FD\u529B\u3002\u8FD9\u4E9B\u76FE\u724C\u5747\u80FD\u591F\u683C\u6321\u4E00\u4E9B$(thing)\u9057\u7269$(0)\u4EA7\u751F\u7684\u5F39\u5C04\u7269\u3002\u7136\u800C\uFF0C\u8FD9\u4E9B\u76FE\u724C\u666E\u904D\u5177\u6709\u8F83\u4F4E\u7684\u8010\u4E45\uFF0C\u96BE\u4EE5\u6301\u7EED\u4F7F\u7528\u3002",
"extrabotany.page.elementium_shield1": "$(item)\u6E90\u8D28\u94A2\u76FE\u724C$(0)\u6210\u529F\u683C\u6321\u4F24\u5BB3\u540E\u4F1A\u6682\u65F6\u63D0\u5347\u76FE\u724C\u672C\u8EAB\u7684\u5C5E\u6027\u3002",
"extrabotany.page.elementium_shield2": "$(item)\u6DF7\u6C8C\u76FE\u724C$(0)\u6210\u529F\u683C\u6321\u4F24\u5BB3\u540E\u4F1A\u5BF9\u5468\u56F4\u7684\u751F\u7269\uFF08\u5305\u62EC\u4F7F\u7528\u8005\uFF09\u9020\u6210\u4E00\u5B9A\u7206\u70B8\u4F24\u5BB3\u3002",
"extrabotany.page.elementium_shield3": "$(item)\u6CF0\u62C9\u94A2\u76FE\u724C$(0)\u6210\u529F\u683C\u6321\u4F24\u5BB3\u540E\u4F1A\u5BF9\u9762\u524D\u7684\u751F\u7269\u9020\u6210\u4E00\u5B9A\u4F24\u5BB3\u3002",
"extrabotany.page.elementium_shield3": "$(item)\u6CF0\u62C9\u94A2\u76FE\u724C$(0)\u4F1A\u53CD\u5F39\u90E8\u5206\u6210\u529F\u683C\u6321\u7684\u8FD1\u6218\u4F24\u5BB3\u3002",
"extrabotany.page.elementium_shield4": "$(item)\u5929\u7A7A\u76FE\u724C$(0)\u6210\u529F\u683C\u6321\u4F24\u5BB3\u540E\u4F1A\u6682\u65F6\u8BA9\u4F7F\u7528\u8005\u53D8\u5F97\u66F4\u52A0\u8F7B\u76C8\u3002",
"extrabotany.page.elementstone0": "\u5C06\u5143\u7D20\u7B26\u6587\u70BC\u5236\u6210\u5BF9\u5E94\u7684\u7B26\u77F3\u3002$(item)\u98CE\u4E4B\u7B26\u77F3$(0)\u53EF\u4EE5\u589E\u52A0\u4F69\u6234\u8005\u7684\u79FB\u901F\uFF0C$(item)\u5730\u4E4B\u7B26\u77F3$(0)\u53EF\u4EE5\u63D0\u9AD8\u4F69\u6234\u8005\u7684\u62A4\u7532\uFF0C$(item)\u6C34\u4E4B\u7B26\u77F3$(0)\u53EF\u4EE5\u51CF\u5C11\u4F69\u6234\u8005\u7684\u9B54\u529B\u6D88\u8017\uFF0C$(item)\u706B\u4E4B\u7B26\u77F3$(0)\u53EF\u4EE5\u63D0\u5347\u4F69\u6234\u8005\u7684\u653B\u51FB\u529B\u3002",
"extrabotany.page.elementstone1": "\u98CE\u4E4B\u7B26\u77F3",

View File

@ -1,7 +0,0 @@
package chick.extrabotany.api.block;
public interface ISubTileDecay
{
int getPassiveTicks();
void setPassiveTicks(int x);
}

View File

@ -1,10 +1,22 @@
package chick.extrabotany.api.block;
import net.minecraftforge.event.TickEvent;
/**
* capability for passive flower
* you need to store passive ticks in block nbt
*/
public interface ISubTilePassiveFlower
{
/**
* get string to store it in the block nbt
* default is "passive_ticks"
*/
default String getTagPassiveTicks()
{
return "passive_ticks";
}
/**
* get ticks it has since last Serenitian in Extrabotany works
*/
@ -15,13 +27,33 @@ public interface ISubTilePassiveFlower
*/
void setPassiveTicks(int x);
/**
* add 1 to passiveTicks
* use it when necessary
*/
void addPassiveTicks();
/**
* just as its name (usually 72000 ticks, that is, 1 hour)
*/
int getMaxPassiveTicks();
int getDecayTicks();
/**
* does the flower block have drops
*/
boolean isNoDrop();
void serenitianWorks();
void decay();
default boolean isHydroangeas()
{
return false;
}
default void tickFlower(TickEvent event)
{
}
}

View File

@ -0,0 +1,5 @@
package chick.extrabotany.common.base;
public class ExtrabotanyReflect
{
}

View File

@ -1,39 +0,0 @@
package chick.extrabotany.common.base;
import chick.extrabotany.api.block.ISubTilePassiveFlower;
import net.minecraft.world.level.block.entity.BlockEntityType;
public class ISubTilePassiveFlowerImpl implements ISubTilePassiveFlower
{
private int passiveTicks;
private BlockEntityType<?> blockEntityType;
public ISubTilePassiveFlowerImpl(BlockEntityType<?> blockEntityType)
{
this.blockEntityType = blockEntityType;
}
@Override
public int getPassiveTicks()
{
return passiveTicks;
}
@Override
public void setPassiveTicks(int x)
{
passiveTicks = x;
}
@Override
public int getMaxPassiveTicks()
{
return 72000;
}
@Override
public boolean isNoDrop()
{
return false;
}
}

View File

@ -1,15 +0,0 @@
package chick.extrabotany.common.blocks;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import vazkii.botania.api.subtile.TileEntityGeneratingFlower;
public abstract class SubTilePassive extends TileEntityGeneratingFlower
{
public SubTilePassive(BlockEntityType<?> type, BlockPos pos, BlockState state)
{
super(type, pos, state);
}
protected int passiveDecayTicks;
}

View File

@ -1,7 +1,7 @@
package chick.extrabotany.common.blocks.subtile.functional;
import chick.extrabotany.common.blocks.ModSubtiles;
import chick.extrabotany.api.block.ISubTileDecay;
import chick.extrabotany.xplat.IXplatAbstractions;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.state.BlockState;
import vazkii.botania.api.subtile.RadiusDescriptor;
@ -28,12 +28,13 @@ public class SubTileSerenitian extends TileEntityFunctionalFlower
{
BlockPos pos = getEffectivePos().offset(dx, 0, dz);
var tile = level.getBlockEntity(pos);
if (tile instanceof ISubTileDecay)
if (tile != null)
{
ISubTileDecay passive = (ISubTileDecay) tile;
if (passive.getPassiveTicks() >= 100)
var c = IXplatAbstractions.INSTANCE.findPassiveFlower(tile);
if (c != null && c.getPassiveTicks() >= 100)
{
passive.setPassiveTicks(0);
c.setPassiveTicks(0);
c.serenitianWorks();
}
}
}

View File

@ -1,23 +1,26 @@
package chick.extrabotany.common.blocks.subtile.generating;
import chick.extrabotany.api.block.ISubTilePassiveFlower;
import chick.extrabotany.common.blocks.ModSubtiles;
import chick.extrabotany.common.blocks.SubTilePassive;
import chick.extrabotany.xplat.IXplatAbstractions;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.Nullable;
import vazkii.botania.api.subtile.RadiusDescriptor;
import vazkii.botania.api.subtile.TileEntityGeneratingFlower;
public class SubTileBellflower extends SubTilePassive
public class SubTileBellflower extends TileEntityGeneratingFlower
{
private static final int RANGE = 3;
private static final int DECAY_TIME = 72000;
private final ISubTilePassiveFlower flower;
public SubTileBellflower(BlockPos pos, BlockState state)
{
super(ModSubtiles.BELLFLOWER, pos, state);
flower = IXplatAbstractions.INSTANCE.findPassiveFlower(this);
}
@Override
@ -51,20 +54,11 @@ public class SubTileBellflower extends SubTilePassive
}
if (this.level.canSeeSky(this.getEffectivePos()) && y > baseY)
{
if (++passiveDecayTicks > DECAY_TIME)
flower.addPassiveTicks();
int rain = this.level.isRaining() ? 10 : 0;
if (flower.getPassiveTicks() % 10 == 0)
{
getLevel().destroyBlock(getBlockPos(), false);
if (Blocks.DEAD_BUSH.defaultBlockState().canSurvive(getLevel(), getBlockPos()))
{
getLevel().setBlockAndUpdate(getBlockPos(), Blocks.DEAD_BUSH.defaultBlockState());
}
} else
{
int rain = this.level.isRaining() ? 10 : 0;
if (this.passiveDecayTicks % 10 == 0)
{
addMana((baseGen + rain) * (int) (0.3F * (float) y / (float) baseY * times));
}
addMana((baseGen + rain) * (int) (0.3F * (float) y / (float) baseY * times));
}
sync();
}
@ -86,14 +80,14 @@ public class SubTileBellflower extends SubTilePassive
public void writeToPacketNBT(CompoundTag cmp)
{
super.writeToPacketNBT(cmp);
cmp.putInt("bellI", passiveDecayTicks);
cmp.putInt(flower.getTagPassiveTicks(), flower.getPassiveTicks());
}
@Override
public void readFromPacketNBT(CompoundTag cmp)
{
super.readFromPacketNBT(cmp);
passiveDecayTicks = cmp.getInt("bellI");
flower.setPassiveTicks(cmp.getInt(flower.getTagPassiveTicks()));
}
@Nullable
@ -102,5 +96,4 @@ public class SubTileBellflower extends SubTilePassive
{
return RadiusDescriptor.Rectangle.square(getEffectivePos(), RANGE);
}
}

View File

@ -1,28 +1,27 @@
package chick.extrabotany.common.blocks.subtile.generating;
import chick.extrabotany.api.block.ISubTilePassiveFlower;
import chick.extrabotany.common.blocks.ModSubtiles;
import chick.extrabotany.api.block.ISubTileDecay;
import chick.extrabotany.common.blocks.SubTilePassive;
import chick.extrabotany.xplat.IXplatAbstractions;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.EmptyFluid;
import net.minecraft.world.level.material.Fluid;
import net.minecraftforge.fluids.IFluidBlock;
import vazkii.botania.api.subtile.RadiusDescriptor;
import vazkii.botania.api.subtile.TileEntityGeneratingFlower;
public class SubTileGeminiOrchid extends SubTilePassive implements ISubTileDecay
public class SubTileGeminiOrchid extends TileEntityGeneratingFlower
{
private static final BlockPos[] OFFSETS = {new BlockPos(0, 0, 1), new BlockPos(0, 0, -1), new BlockPos(1, 0, 0), new BlockPos(-1, 0, 0), new BlockPos(-1, 0, 1), new BlockPos(-1, 0, -1), new BlockPos(1, 0, 1), new BlockPos(1, 0, -1)};
private static final int RANGE = 2;
private static final int DECAY_TIME = 72000;
private final ISubTilePassiveFlower flower;
public SubTileGeminiOrchid(BlockPos pos, BlockState state)
{
super(ModSubtiles.GEMINIORCHID, pos, state);
flower = IXplatAbstractions.INSTANCE.findPassiveFlower(this);
}
@Override
@ -37,7 +36,6 @@ public class SubTileGeminiOrchid extends SubTilePassive implements ISubTileDecay
return 0xFFFF00;
}
@Override
public void tickFlower()
{
@ -67,14 +65,8 @@ public class SubTileGeminiOrchid extends SubTilePassive implements ISubTileDecay
}
if (getMana() < getMaxMana() && tempMax > tempMin)
{
if (++passiveDecayTicks > DECAY_TIME)
{
getLevel().destroyBlock(getBlockPos(), false);
if (Blocks.DEAD_BUSH.defaultBlockState().canSurvive(getLevel(), getBlockPos()))
{
getLevel().setBlockAndUpdate(getBlockPos(), Blocks.DEAD_BUSH.defaultBlockState());
}
} else if (ticksExisted % 8 == 0)
flower.addPassiveTicks();
if (flower.getPassiveTicks() % 8 == 0)
{
addMana((tempMax - tempMin) / 100 > 0 ? (tempMax - tempMin) / 100 : 1);
}
@ -87,14 +79,14 @@ public class SubTileGeminiOrchid extends SubTilePassive implements ISubTileDecay
public void writeToPacketNBT(CompoundTag cmp)
{
super.writeToPacketNBT(cmp);
cmp.putInt("geminiI", passiveDecayTicks);
cmp.putInt(flower.getTagPassiveTicks(), flower.getPassiveTicks());
}
@Override
public void readFromPacketNBT(CompoundTag cmp)
{
super.readFromPacketNBT(cmp);
passiveDecayTicks = cmp.getInt("geminiI");
flower.setPassiveTicks(cmp.getInt(flower.getTagPassiveTicks()));
}
@Override
@ -103,20 +95,4 @@ public class SubTileGeminiOrchid extends SubTilePassive implements ISubTileDecay
return RadiusDescriptor.Rectangle.square(getEffectivePos(), RANGE);
}
@Override
public void setPassiveTicks(int x)
{
sync();
this.passiveDecayTicks = x;
if (x == 0)
{
emitParticle(ParticleTypes.ANGRY_VILLAGER, Math.random() * 0.2, 0.7, Math.random() * 0.2, 0.0D, 0.0D, 0.0D);
}
}
@Override
public int getPassiveTicks()
{
return passiveDecayTicks;
}
}

View File

@ -1,25 +1,26 @@
package chick.extrabotany.common.blocks.subtile.generating;
import chick.extrabotany.api.block.ISubTilePassiveFlower;
import chick.extrabotany.common.blocks.ModSubtiles;
import chick.extrabotany.api.block.ISubTileDecay;
import chick.extrabotany.common.blocks.SubTilePassive;
import chick.extrabotany.xplat.IXplatAbstractions;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import org.jetbrains.annotations.Nullable;
import vazkii.botania.api.subtile.RadiusDescriptor;
import vazkii.botania.api.subtile.TileEntityGeneratingFlower;
public class SubTileMoonlightLily extends SubTilePassive implements ISubTileDecay
public class SubTileMoonlightLily extends TileEntityGeneratingFlower
{
private static final int RANGE = 2;
private static final int DECAY_TIME = 72000;
private boolean particle = false;
private final ISubTilePassiveFlower flower;
public SubTileMoonlightLily(BlockPos pos, BlockState state)
{
super(ModSubtiles.MOONLIGHTLILY, pos, state);
flower = IXplatAbstractions.INSTANCE.findPassiveFlower(this);
}
@Override
@ -48,18 +49,9 @@ public class SubTileMoonlightLily extends SubTilePassive implements ISubTileDeca
particle = false;
} else
{
if (++passiveDecayTicks > DECAY_TIME)
{
getLevel().destroyBlock(getBlockPos(), false);
if (Blocks.DEAD_BUSH.defaultBlockState().canSurvive(getLevel(), getBlockPos()))
{
getLevel().setBlockAndUpdate(getBlockPos(), Blocks.DEAD_BUSH.defaultBlockState());
}
} else
{
particle = true;
addMana(1);
}
flower.addPassiveTicks();
particle = true;
addMana(1);
}
sync();
} else
@ -81,7 +73,7 @@ public class SubTileMoonlightLily extends SubTilePassive implements ISubTileDeca
{
super.writeToPacketNBT(cmp);
cmp.putBoolean("moonB", particle);
cmp.putInt("moonI", passiveDecayTicks);
cmp.putInt(flower.getTagPassiveTicks(), flower.getPassiveTicks());
}
@Override
@ -89,7 +81,7 @@ public class SubTileMoonlightLily extends SubTilePassive implements ISubTileDeca
{
super.readFromPacketNBT(cmp);
particle = cmp.getBoolean("moonB");
passiveDecayTicks = cmp.getInt("moonI");
flower.setPassiveTicks(cmp.getInt(flower.getTagPassiveTicks()));
}
@Nullable
@ -98,20 +90,4 @@ public class SubTileMoonlightLily extends SubTilePassive implements ISubTileDeca
{
return RadiusDescriptor.Rectangle.square(getEffectivePos(), RANGE);
}
@Override
public void setPassiveTicks(int x)
{
sync();
this.passiveDecayTicks = x;
if (x == 0)
{
emitParticle(ParticleTypes.ANGRY_VILLAGER, Math.random() * 0.2, 0.7, Math.random() * 0.2, 0.0D, 0.0D, 0.0D);
}
}
@Override
public int getPassiveTicks()
{
return passiveDecayTicks;
}
}

View File

@ -1,25 +1,26 @@
package chick.extrabotany.common.blocks.subtile.generating;
import chick.extrabotany.api.block.ISubTilePassiveFlower;
import chick.extrabotany.common.blocks.ModSubtiles;
import chick.extrabotany.api.block.ISubTileDecay;
import chick.extrabotany.common.blocks.SubTilePassive;
import chick.extrabotany.xplat.IXplatAbstractions;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import vazkii.botania.api.subtile.RadiusDescriptor;
import vazkii.botania.api.subtile.TileEntityGeneratingFlower;
public class SubTileSunshineLily extends SubTilePassive implements ISubTileDecay
public class SubTileSunshineLily extends TileEntityGeneratingFlower
{
private static final int RANGE = 2;
private static final int DECAY_TIME = 72000;
private boolean particle = false;
private final ISubTilePassiveFlower flower;
public SubTileSunshineLily(BlockPos pos, BlockState state)
{
super(ModSubtiles.SUNSHINELILY, pos, state);
flower = IXplatAbstractions.INSTANCE.findPassiveFlower(this);
}
@Override
@ -34,7 +35,6 @@ public class SubTileSunshineLily extends SubTilePassive implements ISubTileDecay
return 0xFFA500;
}
@Override
public void tickFlower()
{
@ -48,18 +48,9 @@ public class SubTileSunshineLily extends SubTilePassive implements ISubTileDecay
particle = false;
} else
{
if (++passiveDecayTicks > DECAY_TIME)
{
getLevel().destroyBlock(getBlockPos(), false);
if (Blocks.DEAD_BUSH.defaultBlockState().canSurvive(getLevel(), getBlockPos()))
{
getLevel().setBlockAndUpdate(getBlockPos(), Blocks.DEAD_BUSH.defaultBlockState());
}
} else
{
particle = true;
addMana(1);
}
flower.addPassiveTicks();
particle = true;
addMana(1);
}
sync();
} else
@ -81,7 +72,7 @@ public class SubTileSunshineLily extends SubTilePassive implements ISubTileDecay
{
super.writeToPacketNBT(cmp);
cmp.putBoolean("sunB", particle);
cmp.putInt("sunI", passiveDecayTicks);
cmp.putInt(flower.getTagPassiveTicks(), flower.getPassiveTicks());
}
@Override
@ -89,7 +80,7 @@ public class SubTileSunshineLily extends SubTilePassive implements ISubTileDecay
{
super.readFromPacketNBT(cmp);
particle = cmp.getBoolean("sunB");
passiveDecayTicks = cmp.getInt("sunI");
flower.setPassiveTicks(cmp.getInt(flower.getTagPassiveTicks()));
}
@Override
@ -97,19 +88,4 @@ public class SubTileSunshineLily extends SubTilePassive implements ISubTileDecay
{
return RadiusDescriptor.Rectangle.square(getEffectivePos(), RANGE);
}
@Override
public void setPassiveTicks(int x)
{
sync();
this.passiveDecayTicks = x;
if (x == 0)
{
emitParticle(ParticleTypes.ANGRY_VILLAGER, Math.random() * 0.2, 0.7, Math.random() * 0.2, 0.0D, 0.0D, 0.0D);
}
}
@Override
public int getPassiveTicks()
{
return passiveDecayTicks;
}
}

View File

@ -1,13 +1,15 @@
package chick.extrabotany.forge.client;
import chick.extrabotany.ExtraBotany;
import chick.extrabotany.api.ExtraBotanyForgeCapabilities;
import chick.extrabotany.api.block.ISubTilePassiveFlower;
import chick.extrabotany.common.ModBlocks;
import chick.extrabotany.common.ModItemProperties;
import chick.extrabotany.common.ModItems;
import chick.extrabotany.common.base.ISubTilePassiveFlowerImpl;
import chick.extrabotany.forge.impl.ISubTilePassiveFlowerImpl;
import chick.extrabotany.common.baubles.SagesManaRing;
import chick.extrabotany.common.blocks.ModSubtiles;
import chick.extrabotany.common.blocks.subtile.generating.SubTileMoonlightLily;
import chick.extrabotany.common.blocks.tile.TileDimensionCatalyst;
import chick.extrabotany.common.loots.ModLootModifiers;
import chick.extrabotany.common.tools.weapons.*;
@ -113,7 +115,7 @@ public class ForgeClientInitializer
}
/**
* 森林法杖下同
* Register BlockEntity Capabilities
*/
private static final Supplier<Map<BlockEntityType<?>, Function<BlockEntity, IWandHUD>>> WAND_HUD = Suppliers.memoize(() ->
{
@ -127,11 +129,12 @@ public class ForgeClientInitializer
});
return Collections.unmodifiableMap(ret);
});
private static final Supplier<Map<BlockEntityType<?>, Function<BlockEntityType<?>, ISubTilePassiveFlower>>> PASSIVE_FLOWER = Suppliers.memoize(() -> Map.of(
private static final Supplier<Map<BlockEntityType<?>, Function<BlockEntity, ISubTilePassiveFlower>>> PASSIVE_FLOWER = Suppliers.memoize(() -> Map.of(
vazkii.botania.common.block.ModSubtiles.HYDROANGEAS, ISubTilePassiveFlowerImpl::new,
ModSubtiles.SUNSHINELILY, ISubTilePassiveFlowerImpl::new,
ModSubtiles.MOONLIGHTLILY, ISubTilePassiveFlowerImpl::new
));
private static void attachBlockEntityCapabilities(AttachCapabilitiesEvent<BlockEntity> e)
{
var be = e.getObject();
@ -142,8 +145,18 @@ public class ForgeClientInitializer
e.addCapability(prefix("wand_hud"),
CapabilityUtil.makeProvider(BotaniaForgeClientCapabilities.WAND_HUD, makeWandHud.apply(be)));
}
var passiveFlower = PASSIVE_FLOWER.get().get(be.getType());
if (passiveFlower != null)
{
e.addCapability(new ResourceLocation(ExtraBotany.MODID, "passive_flower"),
CapabilityUtil.makeProvider(ExtraBotanyForgeCapabilities.PASSIVE_FLOWER, passiveFlower.apply(be)));
}
}
/**
* Register Item Capabilities
*/
private static final Supplier<Map<Item, Function<ItemStack, IManaItem>>> MANA_ITEM = Suppliers.memoize(() -> Map.of(
ModItems.SAGES_MANA_RING.get(), SagesManaRing.GreaterManaItem::new
));

View File

@ -0,0 +1,99 @@
package chick.extrabotany.forge.impl;
import chick.extrabotany.ExtraBotany;
import chick.extrabotany.api.block.ISubTilePassiveFlower;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
import vazkii.botania.api.subtile.TileEntitySpecialFlower;
import vazkii.botania.common.block.subtile.generating.SubTileHydroangeas;
/**
* default passive flower capability
* just use it if you don't want any change
*/
public class ISubTilePassiveFlowerImpl implements ISubTilePassiveFlower
{
private final TileEntitySpecialFlower flower;
private int passiveTicks;
public ISubTilePassiveFlowerImpl(BlockEntity blockEntity)
{
if (blockEntity instanceof TileEntitySpecialFlower flower)
{
this.flower = flower;
} else
{
throw new IllegalStateException("Extrabotany Error! Not a Special Flower is attached to Capability ISubTilePassiveFlower!");
}
}
@Override
public int getPassiveTicks()
{
if (flower instanceof SubTileHydroangeas hydroangeas)
{
return ObfuscationReflectionHelper.getPrivateValue(SubTileHydroangeas.class, hydroangeas, "passiveDecayTicks");
}
return passiveTicks;
}
@Override
public void setPassiveTicks(int x)
{
ExtraBotany.LOGGER.debug("sb250 impl tick=" + getPassiveTicks());
ExtraBotany.LOGGER.debug("sb250 tag tick=" + flower.saveWithFullMetadata().getInt(getTagPassiveTicks()));
if (flower instanceof SubTileHydroangeas hydroangeas)
{
ObfuscationReflectionHelper.setPrivateValue(SubTileHydroangeas.class, hydroangeas, 0, "passiveDecayTicks");
}
passiveTicks = x;
if (getPassiveTicks() > getDecayTicks())
{
decay();
}
}
@Override
public void addPassiveTicks()
{
setPassiveTicks(getPassiveTicks() + 1);
}
@Override
public int getDecayTicks()
{
return 200;
}
@Override
public boolean isNoDrop()
{
return !(flower instanceof SubTileHydroangeas);
}
@Override
public void serenitianWorks()
{
flower.emitParticle(ParticleTypes.ANGRY_VILLAGER, Math.random() * 0.2, 0.7, Math.random() * 0.2, 0.0D, 0.0D, 0.0D);
}
@Override
public void decay()
{
var level = flower.getLevel();
var blockpos = flower.getBlockPos();
if (level != null)
{
level.destroyBlock(blockpos, false);
if (Blocks.DEAD_BUSH.defaultBlockState().canSurvive(level, blockpos))
{
level.setBlockAndUpdate(blockpos, Blocks.DEAD_BUSH.defaultBlockState());
}
}
}
}

View File

@ -1,43 +0,0 @@
package chick.extrabotany.forge.mixin.client;
import chick.extrabotany.api.block.ISubTileDecay;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.tags.TagKey;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Fluid;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import vazkii.botania.common.block.subtile.generating.SubTileFluidGenerator;
import vazkii.botania.common.block.subtile.generating.SubTileHydroangeas;
@Mixin(SubTileHydroangeas.class)
public abstract class MixinHydroangeas extends SubTileFluidGenerator implements ISubTileDecay
{
//may cause error!
@Shadow
private int passiveDecayTicks;
protected MixinHydroangeas(BlockEntityType<?> type, BlockPos pos, BlockState state, TagKey<Fluid> consumedFluid, int startBurnTime, int manaPerTick, int maxCooldown)
{
super(type, pos, state, consumedFluid, startBurnTime, manaPerTick, maxCooldown);
}
@Override
public void setPassiveTicks(int x)
{
sync();
this.passiveDecayTicks = x;
if (x == 0)
{
emitParticle(ParticleTypes.ANGRY_VILLAGER, Math.random() * 0.2, 0.7, Math.random() * 0.2, 0.0D, 0.0D, 0.0D);
}
}
@Override
public int getPassiveTicks()
{
return passiveDecayTicks;
}
}

View File

@ -0,0 +1,52 @@
package chick.extrabotany.forge.xplat;
import chick.extrabotany.ExtraBotany;
import chick.extrabotany.api.ExtraBotanyForgeCapabilities;
import chick.extrabotany.api.block.ISubTilePassiveFlower;
import chick.extrabotany.xplat.IXplatAbstractions;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.loading.FMLLoader;
import org.jetbrains.annotations.Nullable;
public class ForgeXplatImpl implements IXplatAbstractions
{
@Override
public boolean isForge()
{
return true;
}
@Override
public boolean isModLoaded(String modId)
{
return ModList.get().isLoaded(modId);
}
@Override
public boolean isDevEnvironment()
{
return !FMLLoader.isProduction();
}
@Override
public boolean isPhysicalClient()
{
return FMLLoader.getDist() == Dist.CLIENT;
}
@Override
public String getExtrabotanyVersion()
{
return ModList.get().getModContainerById(ExtraBotany.MODID).get().getModInfo().getVersion().toString();
}
@Nullable
@Override
public ISubTilePassiveFlower findPassiveFlower(BlockEntity blockEntity)
{
return blockEntity.getCapability(ExtraBotanyForgeCapabilities.PASSIVE_FLOWER).orElse(null);
}
}

View File

@ -0,0 +1,51 @@
package chick.extrabotany.xplat;
import chick.extrabotany.ExtraBotany;
import chick.extrabotany.api.block.ISubTilePassiveFlower;
import net.minecraft.world.level.block.entity.BlockEntity;
import javax.annotation.Nullable;
import java.util.ServiceLoader;
import java.util.stream.Collectors;
public interface IXplatAbstractions
{
// Yes, this forms a loop by default. Each loader overrides their own to break the loop
default boolean isFabric()
{
return !isForge();
}
default boolean isForge()
{
return !isFabric();
}
boolean isModLoaded(String modId);
boolean isDevEnvironment();
boolean isPhysicalClient();
String getExtrabotanyVersion();
@Nullable
ISubTilePassiveFlower findPassiveFlower(BlockEntity blockEntity);
IXplatAbstractions INSTANCE = find();
private static IXplatAbstractions find()
{
var providers = ServiceLoader.load(IXplatAbstractions.class).stream().toList();
if (providers.size() != 1)
{
var names = providers.stream().map(p -> p.type().getName()).collect(Collectors.joining(",", "[", "]"));
throw new IllegalStateException("Extrabotany Error:There should be exactly one IXplatAbstractions implementation on the classpath. Found: " + names);
} else
{
var provider = providers.get(0);
ExtraBotany.LOGGER.debug("Instantiating xplat impl: " + provider.type().getName());
return provider.get();
}
}
}

View File

@ -0,0 +1 @@
chick.extrabotany.forge.xplat.ForgeXplatImpl

View File

@ -5,7 +5,6 @@
"package": "chick.extrabotany.forge.mixin",
"client": [
"client.MixinArmorModel",
"client.MixinHydroangeas",
"client.MixinLightning"
],
"injectors": {