mirror of
https://github.com/barkeser2002/CatServer.git
synced 2026-09-25 04:20:02 +03:00
* Some updates
修改一些小问题
FoxServerLauncher#main
launchArgs = Arrays.copyOf(launchArgs, launchArgs.length + args.length);
System.arraycopy(args, 0, launchArgs, launchArgs.length, args.length);
如果有自带启动参数 会ArrayIndexOutOfBoundsException
ShearsDispenseItemBehavior#tryShearLivingEntity
在循环里ShearsDispenseItemBehavior.catserver$shearBukkitBlock.getAndSet(null),下一轮循环读到的会是null
在if里ShearsDispenseItemBehavior.catserver$shearBukkitBlock.getAndSet(null),如果没有进入if则catserver$shearBukkitBlock无法被重置
同时改用CatServerCaptures
ServerLevel#tickPassenger
bukkit加的p_8664_.postTick()处理生物通过地狱门时的传送,应该和p_8664_.rideTick()同时受forge加入的if(p_8664_.canUpdate())控制
ServerGamePacketListenerImpl#onDisconnect
cat注释掉的
// this.server.getPlayerList().remove(this.player); // CatServer - fix dupe player logout
但bukkit并没有留这一行
少了bukkit留下的this.player.disconnect();
看起来像是留错了诶(?)
ServerHandshakePacketListenerImpl#handleIntention
spigot的bug
这些翻译key被spigot换成String后应该是TextComponent(ChatMessage)
spigot1.20.1已修复
Entity#changeDimension
return前pop profiler
调用ServerLevel.makeObsidianPlatform时增加bukkit的this参数
ServerLevel.makeObsidianPlatform(serverLevel, this);
ItemEntity#tick
似乎把bukkit的patch放错位置了
bukkit:
if (!this.level.isClientSide && this.age >= 6000) {
+ // CraftBukkit start - fire ItemDespawnEvent
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) {
+ this.age = 0;
+ return;
+ }
+ // CraftBukkit end
this.discard();
}
LivingEntity#checkFallDamage
forge的.setPos(p_20993_)
LivingEntity#private void addEatEffect(ItemStack p_21064_, Level p_21065_, LivingEntity p_21066_)
重置cause为默认值UNKNOWN
LivingEntity#damageEntity0
改为bukkit的写法 用tag
LivingEntity#randomTeleport
flag和flag1写反辣
forge
boolean flag = false;
BlockPos blockpos = BlockPos.containing(p_20985_, p_20986_, p_20987_);
Level level = this.level();
if (level.hasChunkAt(blockpos)) {
boolean flag1 = false;
if (flag1) {
this.teleportTo(p_20985_, d3, p_20987_);
bukkit
boolean flag1 = false;
BlockPosition blockposition = BlockPosition.containing(d0, d1, d2);
World world = this.level();
if (world.hasChunkAt(blockposition)) {
boolean flag2 = false;
if (flag2) {
- this.teleportTo(d0, d6, d2);
+ this.setPos(d3, d4, d5);
+ if (flag1) {
+ if (!(this instanceof EntityPlayer)) {
cat
boolean flag = false;
BlockPos blockpos = new BlockPos(p_20985_, p_20986_, p_20987_);
Level level = this.level;
if (level.hasChunkAt(blockpos)) {
boolean flag1 = false;
if (flag) {
var cause = CatServerCaptures.getCatServerCaptures().getCaptureTeleportCause();
// CraftBukkit start - Teleport event
// this.teleportTo(p_20985_, d3, p_20987_);
this.setPos(d0, d1, d2);
if (flag1) {
if (!(this instanceof ServerPlayer)) {
LivingEntity#heal
this.resetRegainReason();
保证不进if也能重置
NaturalSpawner#spawnCategoryForPosition
p_47040_.addFreshEntityWithPassengers(mob);用capture传入的reason在ServerLevelAccessor#addFreshEntityWithPassengers未被接收
同时修改ServerLevelAccessor
Mob#convertTo
确保catserver$spawnReason重置
同时改用CatServerCaptures
ZombieVillager#tick
bukkit的
super.tick();
+ this.lastTick = MinecraftServer.currentTick; // CraftBukkit
}
net.minecraft.world.entity.player.Player#public void causeFoodExhaustion(float p_36400_)
this.catserver$causeFoodReason.getAndSet)在if里 如果没有进if的话catserver$causeFoodReason无法重置
同时改用CatServerCaptures
ThrownPotion#applySplash
bukkit的entity1
Raid#tick
似乎有一个bukkit的callRaidStopEvent的位置串了
AbstractMinecart#setDragAir
vanilla
this.setDeltaMovement(this.getDeltaMovement().scale(0.95D));
forge
this.setDeltaMovement(this.getDeltaMovement().scale(getDragAir()));
bukkit+cat
- this.setDeltaMovement(this.getDeltaMovement().scale(0.95D));
+ // CraftBukkit start - replace magic numbers with our variables
+ this.setDeltaMovement(new Vec3D(this.getDeltaMovement().x * this.flyingX, this.getDeltaMovement().y * this.flyingY, this.getDeltaMovement().z * this.flyingZ));
+ // CraftBukkit end
这样的话 似乎forge的dragAir会失效
forge的xyz用同一个scale bukkit用3个 没法在保证各自正常功能的情况下用同一组scale来统一两边 所以用同相乘的关系
this.setDeltaMovement(new Vec3(this.getDeltaMovement().x * this.flyingX, this.getDeltaMovement().y * this.flyingY, this.getDeltaMovement().z * this.flyingZ).scale(getDragAir()));
ChestMenu#getBukkitView
bukkit
if (this.container instanceof PlayerInventory) { -> net.minecraft.world.entity.player.PlayerInventory(official:net.minecraft.world.entity.player.Inventory)
cat
if (this.container instanceof PlayerInventory) { -> org.bukkit.inventory.PlayerInventory
EnchantmentMenu#slotsChanged
j用forge的float类型
改用独立的数组循环索引k
ArmorItem#dispenseArmor
bukkit
public static boolean dispenseArmor(ISourceBlock isourceblock, ItemStack itemstack) {
ItemStack itemstack1 = itemstack.split(1);
if (event.isCancelled()) {
itemstack.grow(1);
return false;
}
if (!event.getItem().equals(craftItem)) {
itemstack.grow(1);
cat
ItemStack itemstack = p_40400_.split(1);
if (event.isCancelled()) {
itemstack.grow(1);
return false;
}
if (!event.getItem().equals(craftItem)) {
itemstack.grow(1);
// Chain to handler for new item
应该是p_40400_
BaseSpawner/MobSpawnerAbstract#serverTick+CraftEventFactory#callSpawnerSpawnEvent
补充spigot patch(这个在1.20.1转为craftbukkit patch)
spigot1182
// Spigot Start
if (org.bukkit.craftbukkit.event.CraftEventFactory.callSpawnerSpawnEvent(entity, blockposition).isCancelled()) {
Entity vehicle = entity.getVehicle();
if (vehicle != null) {
vehicle.discard();
}
for (Entity passenger : entity.getIndirectPassengers()) {
passenger.discard();
}
continue;
}
// Spigot End
CraftEventFactory
public static SpawnerSpawnEvent callSpawnerSpawnEvent(Entity spawnee, BlockPos pos) {
org.bukkit.craftbukkit.v1_18_R2.entity.CraftEntity entity = spawnee.getBukkitEntity();
BlockState state = entity.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()).getState();
if (!(state instanceof org.bukkit.block.CreatureSpawner)) {
state = null;
}
SpawnerSpawnEvent event = new SpawnerSpawnEvent(entity, (org.bukkit.block.CreatureSpawner) state);
entity.getServer().getPluginManager().callEvent(event);
return event;
}
BigDripleafBlock#private static void setTilt(BlockState p_152278_, Level p_152279_, BlockPos p_152280_, Tilt p_152281_)
循环调用了 似乎应该调用下面那个
顺便加个强转
CommandBlock#neighborChanged
flag和flag1
bukkit
boolean flag1 = world.hasNeighborSignal(blockposition);
boolean flag2 = tileentitycommand.isPowered();
// CraftBukkit start
org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
int old = flag2 ? 15 : 0;
int current = flag1 ? 15 : 0;
BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, old, current);
world.getCraftServer().getPluginManager().callEvent(eventRedstone);
flag1 = eventRedstone.getNewCurrent() > 0;
// CraftBukkit end
cat
boolean flag = p_51839_.hasNeighborSignal(p_51840_);
boolean flag1 = commandblockentity.isPowered();
// CraftBukkit start
org.bukkit.block.Block bukkitBlock = p_51839_.getWorld().getBlockAt(p_51840_.getX(), p_51840_.getY(), p_51840_.getZ());
int old = flag1 ? 15 : 0;
int current = flag1 ? 15 : 0;
BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, old, current);
p_51839_.getCraftServer().getPluginManager().callEvent(eventRedstone);
flag1 = eventRedstone.getNewCurrent() > 0;
// CraftBukkit end
AbstractFurnaceBlockEntity#getTotalCookTime
bukkit的patch
BeaconBlockEntity
#applyEffect
#applyEffects
, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.BEACON);
BeehiveBlockEntity
#releaseOccupant
#releaseAllOccupants
确保重置catserver$isForceReleaseAllOccupants catserver$isForceReleaseOccupant
BrewingStandBlockEntity#doBrew
确保catserver$captureBrewBlockEntity重置
同时改用CatServerCaptures
实现// CatServer TODO: missing BrewEvent result
HopperBlockEntity#ejectItems
bukkit
+ ItemStack itemstack1 = addItem(iinventory, iinventory1, CraftItemStack.asNMSCopy(event.getItem()), enumdirection);
cat
ItemStack itemstack1 = addItem(p_155566_, p_155566_, CraftItemStack.asNMSCopy(event.getItem()), direction);
iinventory是method传入的漏斗p_155566_
iinventory1是getAttachedContainer返回的目标tileentity
HopperBlockEntity#private static boolean tryTakeInItemFromSlot(Hopper p_59355_, Container p_59356_, int p_59357_, Direction p_59358_)
考虑mod里implements Hopper的其他BlockEntity/Entity
FireBlock#updateShape
bukkit
+ if (!(generatoraccess instanceof World)) { -> net.minecraft.world.level.Level
cat
if (!(p_53461_ instanceof World)) { -> org.bukkit.World
MushroomBlock#growMushroom
bukkit1201+1182
+ BlockSapling.treeType = (this == Blocks.BROWN_MUSHROOM) ? TreeType.BROWN_MUSHROOM : TreeType.BROWN_MUSHROOM; // CraftBukkit
cat1182
SaplingBlock.treeType = (this == Blocks.BROWN_MUSHROOM) ? TreeType.BROWN_MUSHROOM : TreeType.BROWN_MUSHROOM; // CraftBukkit
bukkit12110
BlockSapling.treeType = (this == Blocks.BROWN_MUSHROOM) ? TreeType.BROWN_MUSHROOM : TreeType.RED_MUSHROOM; // CraftBukkit
bukkit的bug
PistonBaseBlock#moveBlocks
BlockPos和Direction
bukkit
private boolean moveBlocks(World world, BlockPosition blockposition, EnumDirection enumdirection, boolean flag) {
BlockPosition blockposition1 = blockposition.relative(enumdirection);
EnumDirection enumdirection1 = flag ? enumdirection : enumdirection.getOpposite();
+ final org.bukkit.block.Block bblock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
+ event = new BlockPistonExtendEvent(bblock, blocks, CraftBlock.notchToBlockFace(enumdirection1));
+ } else {
+ event = new BlockPistonRetractEvent(bblock, blocks, CraftBlock.notchToBlockFace(enumdirection1));
cat
private boolean moveBlocks(Level p_60182_, BlockPos p_60183_, Direction p_60184_, boolean p_60185_) {
BlockPos blockpos = p_60183_.relative(p_60184_);
Direction direction = p_60185_ ? p_60184_ : p_60184_.getOpposite();
final org.bukkit.block.Block bblock = p_60182_.getWorld().getBlockAt(blockpos.getX(), blockpos.getY(), blockpos.getZ());
event = new BlockPistonExtendEvent(bblock, blocks, CraftBlock.notchToBlockFace(p_60184_));
} else {
event = new BlockPistonRetractEvent(bblock, blocks, CraftBlock.notchToBlockFace(p_60184_));
RedStoneOreBlock#private static void interact(BlockState p_55493_, Level p_55494_, BlockPos p_55495_)
setBlock保留if (!p_55493_.getValue(LIT))判断
* [1.18.2] Update capture value name
* CatServer 1.20.1
* Simple cleanups
86 lines
3.3 KiB
Groovy
86 lines
3.3 KiB
Groovy
plugins {
|
|
id 'com.github.ben-manes.versions'
|
|
id 'org.javamodularity.moduleplugin' version '1.8.3' apply false
|
|
}
|
|
apply plugin: 'java-library'
|
|
apply plugin: 'jacoco'
|
|
apply plugin: 'org.javamodularity.moduleplugin'
|
|
|
|
dependencyUpdates.rejectVersionIf { isNonStable(it.candidate.version) }
|
|
configurations.forEach{ it.transitive = false }
|
|
|
|
dependencies {
|
|
compileOnly("org.jetbrains:annotations:${JETBRAINS_ANNOTATIONS_VERSION}")
|
|
|
|
api("org.ow2.asm:asm:${ASM_VERSION}")
|
|
api("org.ow2.asm:asm-tree:${ASM_VERSION}")
|
|
api("org.ow2.asm:asm-commons:${ASM_VERSION}")
|
|
api("net.minecraftforge:forgespi:${SPI_VERSION}")
|
|
api("net.minecraftforge:mergetool:${MERGETOOL_VERSION}:api")
|
|
api("org.apache.logging.log4j:log4j-api:${LOG4J_VERSION}")
|
|
api("org.slf4j:slf4j-api:${SLF4J_API_VERSION}")
|
|
api("com.google.guava:guava:${GUAVA_VERSION}")
|
|
api("com.google.code.gson:gson:${GSON_VERSION}")
|
|
api("org.apache.maven:maven-artifact:${APACHE_MAVEN_ARTIFACT_VERSION}")
|
|
api("org.apache.commons:commons-lang3:${APACHE_COMMONS_LANG3_VERSION}")
|
|
api("com.electronwill.night-config:core:${NIGHTCONFIG_VERSION}")
|
|
api("com.electronwill.night-config:toml:${NIGHTCONFIG_VERSION}")
|
|
api("cpw.mods:modlauncher:${MODLAUNCHER_VERSION}")
|
|
api("net.minecraftforge:coremods:${COREMODS_VERSION}")
|
|
api("com.mojang:logging:${MOJANG_LOGGING_VERSION}")
|
|
api "net.minecraftforge:JarJarSelector:${JARJAR_VERSION}"
|
|
api "net.minecraftforge:JarJarMetadata:${JARJAR_VERSION}"
|
|
|
|
implementation("net.sf.jopt-simple:jopt-simple:${JOPT_SIMPLE_VERSION}")
|
|
implementation("cpw.mods:securejarhandler:${SECUREJARHANDLER_VERSION}")
|
|
implementation("net.minecraftforge:accesstransformers:${ACCESSTRANSFORMERS_VERSION}")
|
|
implementation("net.minecrell:terminalconsoleappender:${TERMINALCONSOLEAPPENDER_VERSION}")
|
|
// implementation("org.jline:jline:${JLINE_VERSION}")
|
|
|
|
implementation("org.apache.logging.log4j:log4j-core:${LOG4J_VERSION}")
|
|
annotationProcessor("org.apache.logging.log4j:log4j-core:${LOG4J_VERSION}")
|
|
|
|
testCompileOnly("org.jetbrains:annotations:${JETBRAINS_ANNOTATIONS_VERSION}")
|
|
testRuntimeOnly("cpw.mods:bootstraplauncher:${BOOTSTRAPLAUNCHER_VERSION}")
|
|
}
|
|
|
|
task sourcesJar(type: Jar) {
|
|
archiveClassifier = 'sources'
|
|
from sourceSets.main.allSource
|
|
}
|
|
|
|
ext {
|
|
MANIFESTS = [
|
|
'/': [
|
|
'Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
|
|
'Git-Commit': GIT_INFO.abbreviatedId,
|
|
'Git-Branch': GIT_INFO.branch,
|
|
'Build-Number': "${System.getenv('BUILD_NUMBER')?:0}",
|
|
] as LinkedHashMap,
|
|
'net/minecraftforge/fml/loading/': [
|
|
'Specification-Title': 'FMLLoader',
|
|
'Specification-Vendor': 'Forge Development LLC',
|
|
'Specification-Version': '1',
|
|
'Implementation-Title': 'FML Loader',
|
|
'Implementation-Version': '1.0',
|
|
'Implementation-Vendor': 'Forge'
|
|
] as LinkedHashMap
|
|
]
|
|
}
|
|
|
|
jar.doFirst {
|
|
manifest.attributes['Automatic-Module-Name'] = project.name
|
|
MANIFESTS.each { pkg, values ->
|
|
manifest.attributes(values, pkg)
|
|
}
|
|
}
|
|
|
|
tasks.withType(JavaCompile) {
|
|
options.compilerArgs << "-Xlint:-unchecked" << "-Xlint:-deprecation" << "-Xlint:-dep-ann" << "-Xlint:-removal" // CatServer - ignore warnings
|
|
}
|
|
|
|
artifacts {
|
|
archives jar
|
|
archives sourcesJar
|
|
}
|