Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <API/ARK/Ark.h>
- #include <json.hpp>
- #include <API/UE/Math/ColorList.h>
- #include <fstream>
- #pragma comment(lib, "ArkApi.lib")
- #include "json.hpp"
- namespace AntiFireBreath
- {
- float MinimumEnemyStructureDistanceInFoundations;
- nlohmann::json config, TempConfig;
- }
- DECLARE_HOOK(APrimalDinoCharacter_TakeDamage, float, APrimalDinoCharacter*, float, FDamageEvent *, AController *, AActor *);
- DECLARE_HOOK(APrimalCharacter_TakeDamage, float, APrimalCharacter*, float, FDamageEvent *, AController *, AActor *);
- void ReadConfig()
- {
- std::ifstream file(ArkApi::Tools::GetCurrentDir() + "/ArkApi/Plugins/AntiFireBreath/config.json");
- if (!file.is_open())
- throw std::runtime_error("Can't open config.json");
- file >> AntiFireBreath::config;
- file.close();
- AntiFireBreath::MinimumEnemyStructureDistanceInFoundations = AntiFireBreath::config["General"]["MinimumEnemyStructureDistanceInFoundations"];
- }
- void ReloadConfig(APlayerController* player_controller, FString*, bool)
- {
- AShooterPlayerController* shooter_controller = static_cast<AShooterPlayerController*>(player_controller);
- try
- {
- ReadConfig();
- }
- catch (const std::exception& error)
- {
- ArkApi::GetApiUtils().SendServerMessage(shooter_controller, FColorList::Red, "Failed to reload config");
- Log::GetLog()->error(error.what());
- return;
- }
- ArkApi::GetApiUtils().SendServerMessage(shooter_controller, FColorList::Green, "Reloaded config");
- }
- void ReloadConfigRcon(RCONClientConnection* rcon_connection, RCONPacket* rcon_packet, UWorld*)
- {
- FString reply;
- try
- {
- ReadConfig();
- }
- catch (const std::exception& error)
- {
- Log::GetLog()->error(error.what());
- reply = error.what();
- rcon_connection->SendMessageW(rcon_packet->Id, 0, &reply);
- return;
- }
- reply = "Reloaded config";
- rcon_connection->SendMessageW(rcon_packet->Id, 0, &reply);
- }
- float Hook_APrimalCharacter_TakeDamage(APrimalCharacter* _this, float Damage, FDamageEvent* DamageEvent, AController* EventInstigator, AActor* DamageCauser)
- {
- if (EventInstigator && EventInstigator->CharacterField())
- {
- ACharacter* character = EventInstigator->CharacterField();
- if (EventInstigator->TargetingTeamField() > 10000 && character != nullptr && character->IsA(APrimalDinoCharacter::GetPrivateStaticClass()))
- {
- APrimalDinoCharacter* dino = static_cast<APrimalDinoCharacter*>(character);
- FString descr;
- dino->GetDinoDescriptiveName(&descr);
- dino->bUseBPDoHarvestAttack() = false;
- Log::GetLog()->warn(descr.ToString());
- if (dino->bUseBPDoHarvestAttack()() && descr.Contains(L"Direwolf")
- || descr.Contains(L"Dragon")
- || descr.Contains(L"Broodmother"))
- {
- UWorld* world = ArkApi::GetApiUtils().GetWorld();
- TArray<AActor*> new_actors;
- TArray<AActor*> actors_ignore;
- TArray<TEnumAsByte<enum EObjectTypeQuery>> types;
- UKismetSystemLibrary::SphereOverlapActors_NEW(world, EventInstigator->RootComponentField()->RelativeLocationField(),
- static_cast<float>((AntiFireBreath::MinimumEnemyStructureDistanceInFoundations * 300)), &types,
- APrimalStructure::GetPrivateStaticClass(), &actors_ignore,
- &new_actors);
- for (const auto& actor : new_actors)
- {
- APrimalStructure* structure = static_cast<APrimalStructure*>(actor);
- Log::GetLog()->warn(FVector::Distance(EventInstigator->RootComponentField()->RelativeLocationField(), actor->RootComponentField()->RelativeLocationField()));
- if (structure->TargetingTeamField() != EventInstigator->TargetingTeamField())
- {
- return 0;
- }
- }
- }
- return APrimalCharacter_TakeDamage_original(_this, Damage, DamageEvent, EventInstigator, DamageCauser);
- }
- else
- {
- return APrimalCharacter_TakeDamage_original(_this, Damage, DamageEvent, EventInstigator, DamageCauser);
- }
- }return APrimalCharacter_TakeDamage_original(_this, Damage, DamageEvent, EventInstigator, DamageCauser);
- }
- float Hook_APrimalDinoCharacter_TakeDamage(APrimalDinoCharacter* _this, float Damage, FDamageEvent* DamageEvent, AController* EventInstigator, AActor* DamageCauser)
- {
- if (EventInstigator && EventInstigator->CharacterField())
- {
- ACharacter* character = EventInstigator->CharacterField();
- if (_this->TargetingTeamField() > 10000 && character != nullptr && character->IsA(APrimalDinoCharacter::GetPrivateStaticClass()))
- {
- APrimalDinoCharacter* dino = static_cast<APrimalDinoCharacter*>(character);
- FString descr;
- dino->GetDinoDescriptiveName(&descr);
- Log::GetLog()->warn(descr.ToString());
- if (descr.Contains(L"Direwolf")
- || descr.Contains(L"Dragon")
- || descr.Contains(L"Broodmother"))
- {
- UWorld* world = ArkApi::GetApiUtils().GetWorld();
- TArray<AActor*> new_actors;
- TArray<AActor*> actors_ignore;
- TArray<TEnumAsByte<enum EObjectTypeQuery>> types;
- UKismetSystemLibrary::SphereOverlapActors_NEW(world, EventInstigator->RootComponentField()->RelativeLocationField(),
- static_cast<float>((AntiFireBreath::MinimumEnemyStructureDistanceInFoundations * 300)), &types,
- APrimalStructure::GetPrivateStaticClass(), &actors_ignore,
- &new_actors);
- for (const auto& actor : new_actors)
- {
- APrimalStructure* structure = static_cast<APrimalStructure*>(actor);
- Log::GetLog()->warn(FVector::Distance(EventInstigator->RootComponentField()->RelativeLocationField(), actor->RootComponentField()->RelativeLocationField()));
- if (structure->TargetingTeamField() != EventInstigator->TargetingTeamField())
- {
- return 0;
- }
- }
- }
- return APrimalDinoCharacter_TakeDamage_original(_this, Damage, DamageEvent, EventInstigator, DamageCauser);
- }
- else
- {
- return APrimalDinoCharacter_TakeDamage_original(_this, Damage, DamageEvent, EventInstigator, DamageCauser);
- }
- }return APrimalDinoCharacter_TakeDamage_original(_this, Damage, DamageEvent, EventInstigator, DamageCauser);
- }
- void Load()
- {
- Log::Get().Init("AntiFireBreath");
- try
- {
- ReadConfig();
- }
- catch (const std::exception& error)
- {
- Log::GetLog()->error(error.what());
- throw;
- }
- ArkApi::GetCommands().AddConsoleCommand("AntiFireBreath.Reload", &ReloadConfig);
- ArkApi::GetCommands().AddRconCommand("AntiFireBreath.Reload", &ReloadConfigRcon);
- ArkApi::GetHooks().SetHook("APrimalDinoCharacter.TakeDamage", &Hook_APrimalDinoCharacter_TakeDamage, &APrimalDinoCharacter_TakeDamage_original);
- ArkApi::GetHooks().SetHook("APrimalCharacter.TakeDamage", &Hook_APrimalCharacter_TakeDamage, &APrimalCharacter_TakeDamage_original);
- }
- void Unload()
- {
- ArkApi::GetCommands().RemoveConsoleCommand("AntiFireBreath.Reload");
- ArkApi::GetCommands().RemoveRconCommand("AntiFireBreath.Reload");
- ArkApi::GetHooks().DisableHook("APrimalDinoCharacter.TakeDamage", &Hook_APrimalDinoCharacter_TakeDamage);
- ArkApi::GetHooks().DisableHook("APrimalCharacter.TakeDamage", &Hook_APrimalCharacter_TakeDamage);
- }
- BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
- {
- switch (ul_reason_for_call)
- {
- case DLL_PROCESS_ATTACH:
- Load();
- break;
- case DLL_PROCESS_DETACH:
- Unload();
- break;
- }
- return TRUE;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement