#include "Global.h" using namespace ll::hash_utils; void Export_Event_API() { auto eventBus = &ll::event::EventBus::getInstance(); RemoteCall::exportAs( "GMLIB_API", "callCustomEvent", [eventBus](std::string const& eventName, std::string const& eventId) -> bool { if (!RemoteCall::hasFunc(eventName, eventId)) return false; switch (doHash(eventName)) { case doHash("onClientLogin"): { auto Call = RemoteCall::importAs(eventName, eventId); eventBus->emplaceListener( [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( eventName, eventId ); eventBus->emplaceListener( [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(eventName, eventId); eventBus->emplaceListener( [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 position, Actor* spawner)>( eventName, eventId ); eventBus->emplaceListener( [Call](Event::EntityEvent::ItemActorSpawnBeforeEvent& ev) { auto pos = ev.getPosition(); auto dimid = ev.getBlockSource().getDimensionId().id; std::pair 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 position, Actor* spawner)>( eventName, eventId ); eventBus->emplaceListener( [Call](Event::EntityEvent::ItemActorSpawnAfterEvent& ev) { auto pos = ev.getPosition(); auto dimid = ev.getBlockSource().getDimensionId().id; std::pair lsePos = {pos, dimid}; try { Call(&ev.getItem(), (Actor*)&ev.getItemActor(), lsePos, ev.getSpawner()); } catch (...) {} } ); return true; } case doHash("onEntityChangeDim"): { auto Call = RemoteCall::importAs(eventName, eventId); eventBus->emplaceListener( [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(eventName, eventId); eventBus->emplaceListener( [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, Actor* dead)>( eventName, eventId ); eventBus->emplaceListener( [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( eventName, eventId ); eventBus->emplaceListener( [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(eventName, eventId); eventBus->emplaceListener( [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(eventName, eventId); eventBus->emplaceListener( [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(eventName, eventId); eventBus->emplaceListener( [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(eventName, eventId); eventBus->emplaceListener( [Call](Event::EntityEvent::ProjectileCreateBeforeEvent& ev) { bool result = true; try { auto uid = ev.getShooter() ? ev.getShooter()->getOrCreateUniqueID().id : -1; result = Call(&ev.self(), uid); } catch (...) {} if (!result) { ev.cancel(); } } ); return true; } case doHash("ProjectileCreate"): { auto Call = RemoteCall::importAs(eventName, eventId); eventBus->emplaceListener( [Call](Event::EntityEvent::ProjectileCreateAfterEvent& ev) { try { auto uid = ev.getShooter() ? ev.getShooter()->getOrCreateUniqueID().id : -1; Call(&ev.self(), uid); } catch (...) {} } ); return true; } case doHash("SpawnWanderingTrader"): { auto Call = RemoteCall::importAs pos)>(eventName, eventId); eventBus->emplaceListener( [Call](Event::EntityEvent::SpawnWanderingTraderBeforeEvent& ev) { bool result = true; try { result = Call({ev.getPos(), ev.getRegion().getDimensionId()}); } catch (...) {} if (!result) { ev.cancel(); } } ); return true; } case doHash("HandleRequestAction"): { auto Call = RemoteCall::importAs< bool(Player * player, std::string const& actionType, int ContainerNetId, int slot)>( eventName, eventId ); eventBus->emplaceListener( [Call](Event::PlayerEvent::HandleRequestActionBeforeEvent& ev) { bool result = true; try { auto requestAction = (ItemStackRequestActionTransferBase*)&ev.getRequestAction(); result = Call( &ev.self(), magic_enum::enum_name(requestAction->mActionType).data(), (int)requestAction->getSrc().mOpenContainerNetId, requestAction->getSrc().mSlot ); } catch (...) {} if (!result) { ev.cancel(); } } ); return true; } case doHash("SendContainerClosePacket"): { auto Call = RemoteCall::importAs(eventName, eventId); eventBus->emplaceListener( [Call](Event::PacketEvent::ContainerClosePacketSendAfterEvent& ev) { try { Call( ev.getServerNetworkHandler() .getServerPlayer(ev.getNetworkIdentifier(), ev.getPacket().mClientSubId), (int)ev.getPacket().mContainerId ); } catch (...) {} } ); return true; } default: return false; } } ); }