Skip to content
Merged

Neo #11

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [3.4.0] - 2026-2.9

### Added

+ Adapt to 1.21.132

### Fixed

+ Fixed more compatibility issues with the SAPI

## [3.3.1] - 2025-12.25

### Fixed
Expand Down
12 changes: 11 additions & 1 deletion CHANGELOG_ZH.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,21 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [3.4.0] - 2026-2.9

### Added

+ 适配1.21.132

### Fixed

+ 解决了更多的与sapi之间的兼容性问题

## [3.3.1] - 2025-12.25

### Fixed

+ Resolved known compatibility issues with the SAPI.
+ 解决了已知的与sapi之间的兼容性问题

## [3.3.0] - 2025-11.14

Expand Down
13 changes: 13 additions & 0 deletions src/cfsp/core/fix/CFSPFixManager.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
#pragma once

#include "mc/world/level/Tick.h"
#include <string>
#include <unordered_set>


namespace coral_fans::cfsp::fix {
class CFSPRemovingListRecorder {
public:
std::unordered_set<std::string> mRemovingSpList;
Tick mLastTick;
};

class CFSPFixManager {
public:
bool createSpMutex = false;
Expand All @@ -17,6 +27,9 @@ class CFSPFixManager {
void handItemFix();
void sapiFix();

public:
CFSPRemovingListRecorder mRemovingRecord;

public:
void cfspBugFixHook();
};
Expand Down
114 changes: 102 additions & 12 deletions src/cfsp/core/fix/SapiFix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,21 @@
#include "mc/deps/ecs./WeakEntityRef.h"
#include "mc/scripting/modules/minecraft/actor/ScriptActor.h"
#include "mc/scripting/modules/minecraft/events/ScriptActorEventListener.h"
#include "mc/scripting/modules/minecraft/events/ScriptLevelEventListener.h"
#include "mc/scripting/modules/minecraft/events/ScriptActorGlobalEventListener.h"
#include "mc/scripting/modules/minecraft/events/ScriptBlockGlobalEventListener.h"
#include "mc/scripting/modules/minecraft/events/ScriptLevelGlobalEventListener.h"
#include "mc/world/actor/Actor.h"
#include "mc/world/actor/player/Player.h"
#include "mc/world/events/ActorAttackEvent.h"
#include "mc/world/events/ActorDiedEvent.h"
#include "mc/world/events/ActorHealthChangedEvent.h"
#include "mc/world/events/ActorHurtEvent.h"
#include "mc/world/events/ActorRemovedEvent.h"
#include "mc/world/events/EventResult.h"
#include "mc/world/events/ProjectileHitEvent.h"
#include <string>


namespace coral_fans::cfsp::fix {
std::unordered_multiset<std::string> mRemovingSpSet;

LL_TYPE_INSTANCE_HOOK(
CFSPSapiFixHook1,
Expand All @@ -29,7 +31,6 @@ LL_TYPE_INSTANCE_HOOK(
if (auto entityContext = actorRemovedEvent.mEntity->lock()) {
auto actor = Actor::tryGetFromEntity(*entityContext, false);
if (actor && manager::CFSPManager::getInstance().tryGetCFSP(actor).has_value()) {
mRemovingSpSet.insert(static_cast<Player*>(actor)->mName);
return EventResult::KeepGoing;
}
}
Expand All @@ -56,8 +57,8 @@ LL_TYPE_INSTANCE_HOOK(
LL_TYPE_INSTANCE_HOOK(
CFSPSapiFixHook3,
ll::memory::HookPriority::Normal,
ScriptModuleMinecraft::ScriptActorEventListener,
&ScriptModuleMinecraft::ScriptActorEventListener::$onEvent,
ScriptModuleMinecraft::ScriptActorGlobalEventListener,
&ScriptModuleMinecraft::ScriptActorGlobalEventListener::$onEvent,
EventResult,
::ActorHurtEvent const& actorHurtEvent
) {
Expand Down Expand Up @@ -90,8 +91,8 @@ LL_TYPE_INSTANCE_HOOK(
LL_TYPE_INSTANCE_HOOK(
CFSPSapiFixHook5,
ll::memory::HookPriority::Normal,
ScriptModuleMinecraft::ScriptActorEventListener,
&ScriptModuleMinecraft::ScriptActorEventListener::$onEvent,
ScriptModuleMinecraft::ScriptActorGlobalEventListener,
&ScriptModuleMinecraft::ScriptActorGlobalEventListener::$onEvent,
EventResult,
::ActorDiedEvent const& actorDiedEvent
) {
Expand Down Expand Up @@ -122,18 +123,102 @@ LL_TYPE_INSTANCE_HOOK(
LL_TYPE_INSTANCE_HOOK(
CFSPSapiFixHook7,
ll::memory::HookPriority::Normal,
ScriptModuleMinecraft::ScriptLevelEventListener,
&ScriptModuleMinecraft::ScriptLevelEventListener::$onLevelRemovedPlayer,
ScriptModuleMinecraft::ScriptLevelGlobalEventListener,
&ScriptModuleMinecraft::ScriptLevelGlobalEventListener::$onLevelRemovedPlayer,
EventResult,
::Player& player
) {
if (auto it = mRemovingSpSet.find(player.mName); it != mRemovingSpSet.end()) {
mRemovingSpSet.erase(it);
auto& removingList = fix::CFSPFixManager::getInstance().mRemovingRecord.mRemovingSpList;
if (auto it = removingList.find(player.mName); it != removingList.end()) {
return EventResult::KeepGoing;
}
return origin(player);
}

LL_TYPE_INSTANCE_HOOK(
CFSPSapiFixHook8,
ll::memory::HookPriority::Normal,
ScriptModuleMinecraft::ScriptLevelGlobalEventListener,
&ScriptModuleMinecraft::ScriptLevelGlobalEventListener::$onLevelAddedPlayer,
EventResult,
Player& player
) {
if (fix::CFSPFixManager::getInstance().createSpMutex
|| manager::CFSPManager::getInstance().tryGetCFSP(&player).has_value()) {
return EventResult::KeepGoing;
}
return origin(player);
}

LL_TYPE_INSTANCE_HOOK(
CFSPSapiFixHook9,
ll::memory::HookPriority::Normal,
ScriptModuleMinecraft::ScriptLevelGlobalEventListener,
&ScriptModuleMinecraft::ScriptLevelGlobalEventListener::$onLevelRemovedActor,
EventResult,
Actor& actor
) {
if (actor.isSimulatedPlayer()) {
auto& removingList = fix::CFSPFixManager::getInstance().mRemovingRecord.mRemovingSpList;
if (auto it = removingList.find(static_cast<Player*>(&actor)->mName); it != removingList.end()) {
return EventResult::KeepGoing;
}
}
return origin(actor);
}

LL_TYPE_INSTANCE_HOOK(
CFSPSapiFixHook10,
ll::memory::HookPriority::Normal,
ScriptModuleMinecraft::ScriptBlockGlobalEventListener,
&ScriptModuleMinecraft::ScriptBlockGlobalEventListener::$onBlockPlacedByPlayer,
EventResult,
::Player& player,
::Block const& placedBlock,
::BlockPos const& pos,
bool isUnderwater
) {
if (manager::CFSPManager::getInstance().tryGetCFSP(&player).has_value()) {
return EventResult::KeepGoing;
}
return origin(player, placedBlock, pos, isUnderwater);
}

LL_TYPE_INSTANCE_HOOK(
CFSPSapiFixHook11,
ll::memory::HookPriority::Normal,
ScriptModuleMinecraft::ScriptBlockGlobalEventListener,
&ScriptModuleMinecraft::ScriptBlockGlobalEventListener::$onBlockDestroyedByPlayer,
EventResult,
::Player& player,
::Block const& destroyedBlock,
::BlockPos const& pos,
::ItemStackBase const& currentItem,
::ItemStackBase const& itemBeforeBlockBreak
) {
if (manager::CFSPManager::getInstance().tryGetCFSP(&player).has_value()) {
return EventResult::KeepGoing;
}
return origin(player, destroyedBlock, pos, currentItem, itemBeforeBlockBreak);
}

LL_TYPE_INSTANCE_HOOK(
CFSPSapiFixHook12,
ll::memory::HookPriority::Normal,
ScriptModuleMinecraft::ScriptBlockGlobalEventListener,
&ScriptModuleMinecraft::ScriptBlockGlobalEventListener::$onBlockDestructionStarted,
EventResult,
::Player& player,
::BlockPos const& pos,
::Block const& hitBlock,
uchar const face
) {
if (manager::CFSPManager::getInstance().tryGetCFSP(&player).has_value()) {
return EventResult::KeepGoing;
}
return origin(player, pos, hitBlock, face);
}

void CFSPFixManager::sapiFix() {
CFSPSapiFixHook1::hook();
CFSPSapiFixHook2::hook();
Expand All @@ -142,5 +227,10 @@ void CFSPFixManager::sapiFix() {
CFSPSapiFixHook5::hook();
CFSPSapiFixHook6::hook();
CFSPSapiFixHook7::hook();
CFSPSapiFixHook8::hook();
CFSPSapiFixHook9::hook();
CFSPSapiFixHook10::hook();
CFSPSapiFixHook11::hook();
CFSPSapiFixHook12::hook();
}
} // namespace coral_fans::cfsp::fix
7 changes: 5 additions & 2 deletions src/cfsp/core/helper/CFSPAutoFuncHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,15 @@ LL_TYPE_INSTANCE_HOOK(
auto cfsp = manager::CFSPManager::getInstance().tryGetCFSP(this);
if (cfsp.has_value()) {
cfsp.value()->stop();
ll::command::CommandRegistrar::getInstance().addSoftEnumValues("cfspDeadSp", {cfsp.value()->mSaveData.name});
ll::command::CommandRegistrar::getInstance(false).addSoftEnumValues(
"cfspDeadSp",
{cfsp.value()->mSaveData.name}
);
if (manager::CFSPManager::getInstance().getAutoRespawn()) {
cfsp.value()->mTaskid =
base::Schedule::getInstance().getSchedule()->add(20, [cfsp = cfsp.value()](unsigned long long) {
if (!cfsp->respawn()) return false;
ll::command::CommandRegistrar::getInstance().removeSoftEnumValues(
ll::command::CommandRegistrar::getInstance(false).removeSoftEnumValues(
"cfspDeadSp",
{cfsp->mSaveData.name}
);
Expand Down
5 changes: 3 additions & 2 deletions src/cfsp/core/manager/CFSPGroupManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ base::OperateResult CFSPManager::groupCreate(Player* player, std::string const&
group->save();
this->mGroupMap.emplace(gname, group);

ll::command::CommandRegistrar::getInstance().addSoftEnumValues("cfspGroup", {gname});
ll::command::CommandRegistrar::getInstance(false).addSoftEnumValues("cfspGroup", {gname});
return base::OperateResult::success("manager.success.create"_tr());
}

Expand Down Expand Up @@ -82,7 +82,7 @@ base::OperateResult CFSPManager::groupDelete(Player* player, std::string const&
if (checkResult.mType != base::OperateResult::Type::Success
&& !it->second->hasPermission(player, group::GroupPermission::Delete))
return base::OperateResult::error("manager.fail.permissionDenied"_tr());
ll::command::CommandRegistrar::getInstance().removeSoftEnumValues("cfspGroup", {gname});
ll::command::CommandRegistrar::getInstance(false).removeSoftEnumValues("cfspGroup", {gname});
this->mGroupMap.erase(it);
try {
std::filesystem::remove_all(
Expand Down Expand Up @@ -199,6 +199,7 @@ GROUP_FUNC_FROM_SP(Destroy, Destroy(player, spname, _long, times, interval, true
GROUP_FUNC_FROM_SP(Chat, Chat(player, spname, message, true), std::string const& message)
GROUP_FUNC_FROM_SP(RunCmd, RunCmd(player, spname, message, true), std::string const& message)
GROUP_FUNC_FROM_SP(LookAt, LookAt(player, spname, pos, true), Vec3 const& pos)
GROUP_FUNC_FROM_SP(LookAt, LookAt(player, spname, direction, true), simulated_player::SimPlayer::Direction direction)
GROUP_FUNC_FROM_SP(MoveTo, MoveTo(player, spname, pos, speed, true), Vec3 const& pos, float speed)
GROUP_FUNC_FROM_SP(NavTo, NavTo(player, spname, pos, speed, true), Vec3 const& pos, float speed)
GROUP_FUNC_FROM_SP(Tp, Tp(player, spname, pos, dimId, true), Vec3 pos, std::optional<int> dimId)
Expand Down
10 changes: 5 additions & 5 deletions src/cfsp/core/manager/CFSPManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,10 +93,10 @@ void CFSPManager::loadSpSaveData() {
}
}
}
ll::command::CommandRegistrar::getInstance().tryRegisterSoftEnum("cfspOfflineSp", splist);
ll::command::CommandRegistrar::getInstance().tryRegisterSoftEnum("cfspSplist", splist);
ll::command::CommandRegistrar::getInstance().tryRegisterSoftEnum("cfspOnlineSp", {});
ll::command::CommandRegistrar::getInstance().tryRegisterSoftEnum("cfspDeadSp", {});
ll::command::CommandRegistrar::getInstance(false).tryRegisterSoftEnum("cfspOfflineSp", splist);
ll::command::CommandRegistrar::getInstance(false).tryRegisterSoftEnum("cfspSplist", splist);
ll::command::CommandRegistrar::getInstance(false).tryRegisterSoftEnum("cfspOnlineSp", {});
ll::command::CommandRegistrar::getInstance(false).tryRegisterSoftEnum("cfspDeadSp", {});
}

void CFSPManager::loadGroupData() {
Expand All @@ -123,7 +123,7 @@ void CFSPManager::loadGroupData() {
}
}
}
ll::command::CommandRegistrar::getInstance().tryRegisterSoftEnum("cfspGroup", cfspGrouplist);
ll::command::CommandRegistrar::getInstance(false).tryRegisterSoftEnum("cfspGroup", cfspGrouplist);
}

bool CFSPManager::init() {
Expand Down
4 changes: 4 additions & 0 deletions src/cfsp/core/manager/CFSPManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ class CFSPManager {
base::OperateResult spStop(Player* player, std::string const& spname, bool nocheck = false);
base::OperateResult spInfo(Player* player, std::string const& spname, bool nocheck = false);
base::OperateResult spLookAt(Player* player, std::string const& spname, Vec3 const& pos, bool nocheck = false);
base::OperateResult
spLookAt(Player* player, std::string const& spname, simulated_player::SimPlayer::Direction direction, bool nocheck = false);

base::OperateResult spInvInfo(Player* player, std::string const& spname, bool nocheck = false);
base::OperateResult
Expand Down Expand Up @@ -222,6 +224,8 @@ class CFSPManager {
std::vector<base::OperateResult> groupRunCmd(Player* player, std::string const& gname, std::string const& message);

std::vector<base::OperateResult> groupLookAt(Player* player, std::string const& gname, Vec3 const& pos);
std::vector<base::OperateResult>
groupLookAt(Player* player, std::string const& gname, simulated_player::SimPlayer::Direction direction);

std::vector<base::OperateResult>
groupMoveTo(Player* player, std::string const& gname, Vec3 const& pos, float speed = 4.3f);
Expand Down
Loading