2024-06-24 2:13

- 添加jsdoc注释和d.ts补全文件
- 修改getBlockRuntimeId接口,使其支持填写特殊值
- 添加getBlockLightEmission,getGameRules,applyEnchant,removeEnchants,hasEnchant,getEnchantLevel,getEnchantNameAndLevel接口
- 导出事件onEntityChangeDimAfter,DragonRespawn,ProjectileTryCreate,ProjectileCreate
This commit is contained in:
子沐呀
2024-06-24 02:13:25 +08:00
Unverified
parent f5947784bf
commit ea9934f315
8 changed files with 3024 additions and 293 deletions
+68 -3
View File
@@ -599,8 +599,8 @@ void Export_Compatibility_API() {
return result;
}
);
RemoteCall::exportAs("GMLIB_API", "getBlockRuntimeId", [](std::string const& blockName) -> uint {
if (auto block = Block::tryGetFromRegistry(blockName)) {
RemoteCall::exportAs("GMLIB_API", "getBlockRuntimeId", [](std::string const& blockName, short legacyData) -> uint {
if (auto block = Block::tryGetFromRegistry(blockName, legacyData)) {
return block->getRuntimeId();
}
return 0;
@@ -648,7 +648,10 @@ void Export_Compatibility_API() {
return item->canDestroy(block);
});
RemoteCall::exportAs("GMLIB_API", "itemCanDestroyInCreative", [](ItemStack const* item) -> bool {
return item->getItem()->canDestroyInCreative();
if (auto itemDef = item->getItem()) {
return itemDef->canDestroyInCreative();
}
return false;
});
RemoteCall::exportAs("GMLIB_API", "itemCanDestroySpecial", [](ItemStack const* item, Block const* block) -> bool {
return item->canDestroySpecial(*block);
@@ -678,4 +681,66 @@ void Export_Compatibility_API() {
}
return "tile.unknown.name";
});
RemoteCall::exportAs(
"GMLIB_API",
"getBlockLightEmission",
[](std::string const& blockName, short legacyData) -> char {
if (auto block = Block::tryGetFromRegistry(blockName, legacyData)) {
return (char)block->getLightEmission().value;
}
return -1;
}
);
RemoteCall::exportAs(
"GMLIB_API",
"getGameRules",
[]() -> std::vector<std::unordered_map<std::string, std::string>> {
auto gameRules = ll::service::getLevel()->getGameRules().getRules();
std::vector<std::unordered_map<std::string, std::string>> result;
for (auto& gameRule : gameRules) {
std::unordered_map<std::string, std::string> data;
data["Name"] = gameRule.getName();
switch (gameRule.getType()) {
case GameRule::Type::Bool:
data["Type"] = "Bool";
data["Value"] = std::to_string(gameRule.getBool());
break;
case GameRule::Type::Float:
data["Type"] = "Float";
data["Value"] = std::to_string(gameRule.getFloat());
break;
case GameRule::Type::Int:
data["Type"] = "Int";
data["Value"] = std::to_string(gameRule.getInt());
break;
case GameRule::Type::Invalid:
break;
}
result.push_back(data);
}
return result;
}
);
RemoteCall::exportAs("GMLIB_API", "getLegalEnchants", [](ItemStack const* item) -> std::vector<int> {
return EnchantUtils::getLegalEnchants(item->getItem());
});
RemoteCall::exportAs(
"GMLIB_API",
"applyEnchant",
[](ItemStack const* item, int id, int level, bool allowNonVanilla) -> bool {
return EnchantUtils::applyEnchant((ItemStackBase&)*item, (Enchant::Type)id, level, allowNonVanilla);
}
);
RemoteCall::exportAs("GMLIB_API", "removeEnchants", [](ItemStack const* item) -> void {
EnchantUtils::removeEnchants((ItemStack&)*item);
});
RemoteCall::exportAs("GMLIB_API", "hasEnchant", [](ItemStack const* item, int id) -> bool {
return EnchantUtils::hasEnchant((Enchant::Type)id, (ItemStackBase&)*item);
});
RemoteCall::exportAs("GMLIB_API", "getEnchantLevel", [](ItemStack const* item, int id) -> int {
return EnchantUtils::getEnchantLevel((Enchant::Type)id, (ItemStackBase&)*item);
});
RemoteCall::exportAs("GMLIB_API", "getEnchantNameAndLevel", [](int id, int level) -> std::string {
return EnchantUtils::getEnchantNameAndLevel((Enchant::Type)id, level);
});
}
+242 -188
View File
@@ -7,195 +7,249 @@ void Export_Event_API() {
"GMLIB_API",
"callCustomEvent",
[eventBus](std::string const& eventName, std::string const& eventId) -> bool {
if (RemoteCall::hasFunc(eventName, eventId)) {
switch (doHash(eventName)) {
case doHash("onClientLogin"): {
auto Call = RemoteCall::importAs<bool(
std::string const& realName,
std::string const& uuid,
std::string const& serverXuid,
std::string const& clientXuid
)>(eventName, eventId);
eventBus->emplaceListener<Event::PacketEvent::ClientLoginAfterEvent>(
[Call](Event::PacketEvent::ClientLoginAfterEvent& ev) {
try {
Call(
ev.getRealName(),
ev.getUuid().asString(),
ev.getServerAuthXuid(),
ev.getClientAuthXuid()
);
} catch (...) {}
}
);
return true;
}
case doHash("onWeatherChange"): {
auto Call =
RemoteCall::importAs<bool(int lightningLevel, int rainLevel, int lightningLast, int rainLast)>(
eventName,
eventId
);
eventBus->emplaceListener<Event::LevelEvent::WeatherUpdateBeforeEvent>(
[Call](Event::LevelEvent::WeatherUpdateBeforeEvent& ev) {
bool result = true;
try {
result = Call(
ev.getLightningLevel(),
ev.getRainLevel(),
ev.getLightningLastTick(),
ev.getRainingLastTick()
);
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
case doHash("onMobPick"): {
auto Call = RemoteCall::importAs<bool(Actor * mob, Actor * item)>(eventName, eventId);
eventBus->emplaceListener<Event::EntityEvent::MobPickupItemBeforeEvent>(
[Call](Event::EntityEvent::MobPickupItemBeforeEvent& ev) {
bool result = true;
try {
result = Call(&ev.self(), (Actor*)&ev.getItemActor());
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
case doHash("onItemTrySpawn"): {
auto Call = RemoteCall::importAs<
bool(const ItemStack* item, std::pair<Vec3, int> position, Actor* spawner)>(eventName, eventId);
eventBus->emplaceListener<Event::EntityEvent::ItemActorSpawnBeforeEvent>(
[Call](Event::EntityEvent::ItemActorSpawnBeforeEvent& ev) {
auto pos = ev.getPosition();
auto dimid = ev.getBlockSource().getDimensionId().id;
std::pair<Vec3, int> lsePos = {pos, dimid};
bool result = true;
try {
result = Call(&ev.getItem(), lsePos, ev.getSpawner());
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
case doHash("onItemSpawned"): {
auto Call = RemoteCall::importAs<
bool(const ItemStack* item, Actor* itemActor, std::pair<Vec3, int> position, Actor* spawner)>(
eventName,
eventId
);
eventBus->emplaceListener<Event::EntityEvent::ItemActorSpawnAfterEvent>(
[Call](Event::EntityEvent::ItemActorSpawnAfterEvent& ev) {
auto pos = ev.getPosition();
auto dimid = ev.getBlockSource().getDimensionId().id;
std::pair<Vec3, int> lsePos = {pos, dimid};
try {
Call(&ev.getItem(), (Actor*)&ev.getItemActor(), lsePos, ev.getSpawner());
} catch (...) {}
}
);
return true;
}
case doHash("onEntityChangeDim"): {
auto Call = RemoteCall::importAs<bool(Actor * entity, int toDimId)>(eventName, eventId);
eventBus->emplaceListener<Event::EntityEvent::ActorChangeDimensionBeforeEvent>(
[Call](Event::EntityEvent::ActorChangeDimensionBeforeEvent& ev) {
bool result = true;
try {
result = Call(&ev.self(), ev.getToDimensionId());
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
case doHash("onLeaveBed"): {
auto Call = RemoteCall::importAs<bool(Player * pl)>(eventName, eventId);
eventBus->emplaceListener<Event::PlayerEvent::PlayerStopSleepBeforeEvent>(
[Call](Event::PlayerEvent::PlayerStopSleepBeforeEvent& ev) {
bool result = true;
try {
result = Call(&ev.self());
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
case doHash("onDeathMessage"): {
auto Call =
RemoteCall::importAs<bool(std::string const& message, std::vector<std::string>, Actor* dead)>(
eventName,
eventId
);
eventBus->emplaceListener<Event::EntityEvent::DeathMessageAfterEvent>(
[Call](Event::EntityEvent::DeathMessageAfterEvent& ev) {
auto msg = ev.getDeathMessage();
auto source = ev.getDamageSource();
try {
Call(msg.first, msg.second, &ev.self());
} catch (...) {}
}
);
return true;
}
case doHash("onMobHurted"): {
auto Call = RemoteCall::importAs<bool(Actor * mob, Actor * source, float damage, int cause)>(
eventName,
eventId
);
eventBus->emplaceListener<Event::EntityEvent::MobHurtAfterEvent>(
[Call](Event::EntityEvent::MobHurtAfterEvent& ev) {
auto& damageSource = ev.getSource();
Actor* source = nullptr;
if (damageSource.isEntitySource()) {
auto uniqueId = damageSource.getDamagingEntityUniqueID();
source = ll::service::getLevel()->fetchEntity(uniqueId);
if (source->getOwner()) {
source = source->getOwner();
}
}
try {
Call(&ev.self(), source, ev.getDamage(), (int)damageSource.getCause());
} catch (...) {}
}
);
return true;
}
case doHash("onEndermanTake"): {
auto Call = RemoteCall::importAs<bool(Actor * mob)>(eventName, eventId);
eventBus->emplaceListener<Event::EntityEvent::EndermanTakeBlockBeforeEvent>(
[Call](Event::EntityEvent::EndermanTakeBlockBeforeEvent& ev) {
bool result = true;
try {
result = Call(&ev.self());
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
default:
return false;
}
if (!RemoteCall::hasFunc(eventName, eventId)) return false;
switch (doHash(eventName)) {
case doHash("onClientLogin"): {
auto Call = RemoteCall::importAs<bool(
std::string const& realName,
std::string const& uuid,
std::string const& serverXuid,
std::string const& clientXuid
)>(eventName, eventId);
eventBus->emplaceListener<Event::PacketEvent::ClientLoginAfterEvent>(
[Call](Event::PacketEvent::ClientLoginAfterEvent& ev) {
try {
Call(
ev.getRealName(),
ev.getUuid().asString(),
ev.getServerAuthXuid(),
ev.getClientAuthXuid()
);
} catch (...) {}
}
);
return true;
}
case doHash("onWeatherChange"): {
auto Call =
RemoteCall::importAs<bool(int lightningLevel, int rainLevel, int lightningLast, int rainLast)>(
eventName,
eventId
);
eventBus->emplaceListener<Event::LevelEvent::WeatherUpdateBeforeEvent>(
[Call](Event::LevelEvent::WeatherUpdateBeforeEvent& ev) {
bool result = true;
try {
result = Call(
ev.getLightningLevel(),
ev.getRainLevel(),
ev.getLightningLastTick(),
ev.getRainingLastTick()
);
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
case doHash("onMobPick"): {
auto Call = RemoteCall::importAs<bool(Actor * mob, Actor * item)>(eventName, eventId);
eventBus->emplaceListener<Event::EntityEvent::MobPickupItemBeforeEvent>(
[Call](Event::EntityEvent::MobPickupItemBeforeEvent& ev) {
bool result = true;
try {
result = Call(&ev.self(), (Actor*)&ev.getItemActor());
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
case doHash("onItemTrySpawn"): {
auto Call =
RemoteCall::importAs<bool(const ItemStack* item, std::pair<Vec3, int> position, Actor* spawner)>(
eventName,
eventId
);
eventBus->emplaceListener<Event::EntityEvent::ItemActorSpawnBeforeEvent>(
[Call](Event::EntityEvent::ItemActorSpawnBeforeEvent& ev) {
auto pos = ev.getPosition();
auto dimid = ev.getBlockSource().getDimensionId().id;
std::pair<Vec3, int> lsePos = {pos, dimid};
bool result = true;
try {
result = Call(&ev.getItem(), lsePos, ev.getSpawner());
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
case doHash("onItemSpawned"): {
auto Call = RemoteCall::importAs<
bool(const ItemStack* item, Actor* itemActor, std::pair<Vec3, int> position, Actor* spawner)>(
eventName,
eventId
);
eventBus->emplaceListener<Event::EntityEvent::ItemActorSpawnAfterEvent>(
[Call](Event::EntityEvent::ItemActorSpawnAfterEvent& ev) {
auto pos = ev.getPosition();
auto dimid = ev.getBlockSource().getDimensionId().id;
std::pair<Vec3, int> lsePos = {pos, dimid};
try {
Call(&ev.getItem(), (Actor*)&ev.getItemActor(), lsePos, ev.getSpawner());
} catch (...) {}
}
);
return true;
}
case doHash("onEntityChangeDim"): {
auto Call = RemoteCall::importAs<bool(Actor * entity, int toDimId)>(eventName, eventId);
eventBus->emplaceListener<Event::EntityEvent::ActorChangeDimensionBeforeEvent>(
[Call](Event::EntityEvent::ActorChangeDimensionBeforeEvent& ev) {
bool result = true;
try {
result = Call(&ev.self(), ev.getToDimensionId());
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
case doHash("onLeaveBed"): {
auto Call = RemoteCall::importAs<bool(Player * pl)>(eventName, eventId);
eventBus->emplaceListener<Event::PlayerEvent::PlayerStopSleepBeforeEvent>(
[Call](Event::PlayerEvent::PlayerStopSleepBeforeEvent& ev) {
bool result = true;
try {
result = Call(&ev.self());
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
case doHash("onDeathMessage"): {
auto Call =
RemoteCall::importAs<bool(std::string const& message, std::vector<std::string>, Actor* dead)>(
eventName,
eventId
);
eventBus->emplaceListener<Event::EntityEvent::DeathMessageAfterEvent>(
[Call](Event::EntityEvent::DeathMessageAfterEvent& ev) {
auto msg = ev.getDeathMessage();
auto source = ev.getDamageSource();
try {
Call(msg.first, msg.second, &ev.self());
} catch (...) {}
}
);
return true;
}
case doHash("onMobHurted"): {
auto Call = RemoteCall::importAs<bool(Actor * mob, Actor * source, float damage, int cause)>(
eventName,
eventId
);
eventBus->emplaceListener<Event::EntityEvent::MobHurtAfterEvent>(
[Call](Event::EntityEvent::MobHurtAfterEvent& ev) {
auto& damageSource = ev.getSource();
Actor* source = nullptr;
if (damageSource.isEntitySource()) {
auto uniqueId = damageSource.getDamagingEntityUniqueID();
source = ll::service::getLevel()->fetchEntity(uniqueId);
if (source->getOwner()) {
source = source->getOwner();
}
}
try {
Call(&ev.self(), source, ev.getDamage(), (int)damageSource.getCause());
} catch (...) {}
}
);
return true;
}
case doHash("onEndermanTake"): {
auto Call = RemoteCall::importAs<bool(Actor * mob)>(eventName, eventId);
eventBus->emplaceListener<Event::EntityEvent::EndermanTakeBlockBeforeEvent>(
[Call](Event::EntityEvent::EndermanTakeBlockBeforeEvent& ev) {
bool result = true;
try {
result = Call(&ev.self());
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
case doHash("onEntityChangeDimAfter"): {
auto Call = RemoteCall::importAs<bool(Actor * mob, int fromDimId)>(eventName, eventId);
eventBus->emplaceListener<Event::EntityEvent::ActorChangeDimensionAfterEvent>(
[Call](Event::EntityEvent::ActorChangeDimensionAfterEvent& ev) {
bool result = true;
try {
result = Call(&ev.self(), ev.getFromDimensionId());
} catch (...) {}
}
);
return true;
}
case doHash("DragonRespawn"): {
auto Call = RemoteCall::importAs<bool(int64 enderDragonUniqueID)>(eventName, eventId);
eventBus->emplaceListener<Event::EntityEvent::DragonRespawnBeforeEvent>(
[Call](Event::EntityEvent::DragonRespawnBeforeEvent& ev) {
bool result = true;
try {
result = Call(ev.getEnderDragon().id);
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
case doHash("ProjectileTryCreate"): {
auto Call = RemoteCall::importAs<bool(Actor * mob)>(eventName, eventId);
eventBus->emplaceListener<Event::EntityEvent::ProjectileCreateBeforeEvent>(
[Call](Event::EntityEvent::ProjectileCreateBeforeEvent& ev) {
bool result = true;
try {
result = Call(&ev.self());
} catch (...) {}
if (!result) {
ev.cancel();
}
}
);
return true;
}
case doHash("ProjectileCreate"): {
auto Call = RemoteCall::importAs<bool(Actor * mob)>(eventName, eventId);
eventBus->emplaceListener<Event::EntityEvent::ProjectileCreateAfterEvent>(
[Call](Event::EntityEvent::ProjectileCreateAfterEvent& ev) {
try {
Call(&ev.self());
} catch (...) {}
}
);
return true;
}
default:
return false;
}
return false;
}
);
}