Advertisement
Guest User

Untitled

a guest
Jan 20th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.08 KB | None | 0 0
  1. #include <iostream>
  2. #include <API/ARK/Ark.h>
  3. #include <json.hpp>
  4. #include <API/UE/Math/ColorList.h>
  5. #include <fstream>
  6.  
  7.  
  8. #pragma comment(lib, "ArkApi.lib")
  9. #include "json.hpp"
  10. namespace AntiFireBreath
  11. {
  12.  
  13. float MinimumEnemyStructureDistanceInFoundations;
  14. nlohmann::json config, TempConfig;
  15. }
  16.  
  17. DECLARE_HOOK(APrimalDinoCharacter_TakeDamage, float, APrimalDinoCharacter*, float, FDamageEvent *, AController *, AActor *);
  18. DECLARE_HOOK(APrimalCharacter_TakeDamage, float, APrimalCharacter*, float, FDamageEvent *, AController *, AActor *);
  19.  
  20. void ReadConfig()
  21. {
  22. std::ifstream file(ArkApi::Tools::GetCurrentDir() + "/ArkApi/Plugins/AntiFireBreath/config.json");
  23. if (!file.is_open())
  24. throw std::runtime_error("Can't open config.json");
  25.  
  26. file >> AntiFireBreath::config;
  27.  
  28. file.close();
  29. AntiFireBreath::MinimumEnemyStructureDistanceInFoundations = AntiFireBreath::config["General"]["MinimumEnemyStructureDistanceInFoundations"];
  30. }
  31.  
  32. void ReloadConfig(APlayerController* player_controller, FString*, bool)
  33. {
  34. AShooterPlayerController* shooter_controller = static_cast<AShooterPlayerController*>(player_controller);
  35.  
  36. try
  37. {
  38. ReadConfig();
  39. }
  40. catch (const std::exception& error)
  41. {
  42. ArkApi::GetApiUtils().SendServerMessage(shooter_controller, FColorList::Red, "Failed to reload config");
  43.  
  44. Log::GetLog()->error(error.what());
  45. return;
  46. }
  47.  
  48. ArkApi::GetApiUtils().SendServerMessage(shooter_controller, FColorList::Green, "Reloaded config");
  49. }
  50.  
  51. void ReloadConfigRcon(RCONClientConnection* rcon_connection, RCONPacket* rcon_packet, UWorld*)
  52. {
  53. FString reply;
  54.  
  55. try
  56. {
  57. ReadConfig();
  58. }
  59. catch (const std::exception& error)
  60. {
  61. Log::GetLog()->error(error.what());
  62.  
  63. reply = error.what();
  64. rcon_connection->SendMessageW(rcon_packet->Id, 0, &reply);
  65. return;
  66. }
  67.  
  68. reply = "Reloaded config";
  69. rcon_connection->SendMessageW(rcon_packet->Id, 0, &reply);
  70. }
  71.  
  72.  
  73.  
  74. float Hook_APrimalCharacter_TakeDamage(APrimalCharacter* _this, float Damage, FDamageEvent* DamageEvent, AController* EventInstigator, AActor* DamageCauser)
  75. {
  76. if (EventInstigator && EventInstigator->CharacterField())
  77. {
  78. ACharacter* character = EventInstigator->CharacterField();
  79. if (EventInstigator->TargetingTeamField() > 10000 && character != nullptr && character->IsA(APrimalDinoCharacter::GetPrivateStaticClass()))
  80. {
  81. APrimalDinoCharacter* dino = static_cast<APrimalDinoCharacter*>(character);
  82. FString descr;
  83. dino->GetDinoDescriptiveName(&descr);
  84. dino->bUseBPDoHarvestAttack() = false;
  85. Log::GetLog()->warn(descr.ToString());
  86. if (dino->bUseBPDoHarvestAttack()() && descr.Contains(L"Direwolf")
  87. || descr.Contains(L"Dragon")
  88. || descr.Contains(L"Broodmother"))
  89. {
  90. UWorld* world = ArkApi::GetApiUtils().GetWorld();
  91. TArray<AActor*> new_actors;
  92. TArray<AActor*> actors_ignore;
  93. TArray<TEnumAsByte<enum EObjectTypeQuery>> types;
  94.  
  95. UKismetSystemLibrary::SphereOverlapActors_NEW(world, EventInstigator->RootComponentField()->RelativeLocationField(),
  96.  
  97. static_cast<float>((AntiFireBreath::MinimumEnemyStructureDistanceInFoundations * 300)), &types,
  98. APrimalStructure::GetPrivateStaticClass(), &actors_ignore,
  99. &new_actors);
  100.  
  101. for (const auto& actor : new_actors)
  102. {
  103. APrimalStructure* structure = static_cast<APrimalStructure*>(actor);
  104. Log::GetLog()->warn(FVector::Distance(EventInstigator->RootComponentField()->RelativeLocationField(), actor->RootComponentField()->RelativeLocationField()));
  105. if (structure->TargetingTeamField() != EventInstigator->TargetingTeamField())
  106. {
  107. return 0;
  108. }
  109. }
  110. }
  111. return APrimalCharacter_TakeDamage_original(_this, Damage, DamageEvent, EventInstigator, DamageCauser);
  112. }
  113. else
  114. {
  115. return APrimalCharacter_TakeDamage_original(_this, Damage, DamageEvent, EventInstigator, DamageCauser);
  116. }
  117. }return APrimalCharacter_TakeDamage_original(_this, Damage, DamageEvent, EventInstigator, DamageCauser);
  118. }
  119.  
  120.  
  121.  
  122.  
  123.  
  124. float Hook_APrimalDinoCharacter_TakeDamage(APrimalDinoCharacter* _this, float Damage, FDamageEvent* DamageEvent, AController* EventInstigator, AActor* DamageCauser)
  125.  
  126. {
  127. if (EventInstigator && EventInstigator->CharacterField())
  128. {
  129. ACharacter* character = EventInstigator->CharacterField();
  130. if (_this->TargetingTeamField() > 10000 && character != nullptr && character->IsA(APrimalDinoCharacter::GetPrivateStaticClass()))
  131. {
  132. APrimalDinoCharacter* dino = static_cast<APrimalDinoCharacter*>(character);
  133. FString descr;
  134. dino->GetDinoDescriptiveName(&descr);
  135. Log::GetLog()->warn(descr.ToString());
  136. if (descr.Contains(L"Direwolf")
  137. || descr.Contains(L"Dragon")
  138. || descr.Contains(L"Broodmother"))
  139. {
  140. UWorld* world = ArkApi::GetApiUtils().GetWorld();
  141. TArray<AActor*> new_actors;
  142. TArray<AActor*> actors_ignore;
  143. TArray<TEnumAsByte<enum EObjectTypeQuery>> types;
  144.  
  145. UKismetSystemLibrary::SphereOverlapActors_NEW(world, EventInstigator->RootComponentField()->RelativeLocationField(),
  146.  
  147. static_cast<float>((AntiFireBreath::MinimumEnemyStructureDistanceInFoundations * 300)), &types,
  148. APrimalStructure::GetPrivateStaticClass(), &actors_ignore,
  149. &new_actors);
  150.  
  151. for (const auto& actor : new_actors)
  152. {
  153. APrimalStructure* structure = static_cast<APrimalStructure*>(actor);
  154. Log::GetLog()->warn(FVector::Distance(EventInstigator->RootComponentField()->RelativeLocationField(), actor->RootComponentField()->RelativeLocationField()));
  155. if (structure->TargetingTeamField() != EventInstigator->TargetingTeamField())
  156. {
  157. return 0;
  158. }
  159. }
  160. }
  161. return APrimalDinoCharacter_TakeDamage_original(_this, Damage, DamageEvent, EventInstigator, DamageCauser);
  162. }
  163. else
  164. {
  165. return APrimalDinoCharacter_TakeDamage_original(_this, Damage, DamageEvent, EventInstigator, DamageCauser);
  166. }
  167. }return APrimalDinoCharacter_TakeDamage_original(_this, Damage, DamageEvent, EventInstigator, DamageCauser);
  168. }
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178. void Load()
  179. {
  180. Log::Get().Init("AntiFireBreath");
  181.  
  182. try
  183. {
  184. ReadConfig();
  185. }
  186. catch (const std::exception& error)
  187. {
  188. Log::GetLog()->error(error.what());
  189. throw;
  190. }
  191. ArkApi::GetCommands().AddConsoleCommand("AntiFireBreath.Reload", &ReloadConfig);
  192. ArkApi::GetCommands().AddRconCommand("AntiFireBreath.Reload", &ReloadConfigRcon);
  193. ArkApi::GetHooks().SetHook("APrimalDinoCharacter.TakeDamage", &Hook_APrimalDinoCharacter_TakeDamage, &APrimalDinoCharacter_TakeDamage_original);
  194. ArkApi::GetHooks().SetHook("APrimalCharacter.TakeDamage", &Hook_APrimalCharacter_TakeDamage, &APrimalCharacter_TakeDamage_original);
  195. }
  196.  
  197. void Unload()
  198. {
  199. ArkApi::GetCommands().RemoveConsoleCommand("AntiFireBreath.Reload");
  200. ArkApi::GetCommands().RemoveRconCommand("AntiFireBreath.Reload");
  201. ArkApi::GetHooks().DisableHook("APrimalDinoCharacter.TakeDamage", &Hook_APrimalDinoCharacter_TakeDamage);
  202. ArkApi::GetHooks().DisableHook("APrimalCharacter.TakeDamage", &Hook_APrimalCharacter_TakeDamage);
  203. }
  204.  
  205.  
  206. BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
  207. {
  208. switch (ul_reason_for_call)
  209. {
  210. case DLL_PROCESS_ATTACH:
  211. Load();
  212. break;
  213. case DLL_PROCESS_DETACH:
  214. Unload();
  215. break;
  216. }
  217. return TRUE;
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement