Skip to content

Commit

Permalink
Kill Feed 2.2
Browse files Browse the repository at this point in the history
Added DisplayDistance to options now you can choose to give away the attackers distance or not
Clean up
  • Loading branch information
ownprox committed Feb 27, 2018
1 parent 151efcd commit ecf8bc2
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 46 deletions.
4 changes: 2 additions & 2 deletions KillFeed/KillFeed/KillFeed.h
@@ -1,12 +1,12 @@
#pragma once
#include <Windows.h>
#include "API\ARK\Ark.h"
bool PlayerKillsEnabled, DinoKillsEnabled, DisplayInChatbox, DisplaySameTribeKills;
bool PlayerKillsEnabled, DinoKillsEnabled, DisplayInChatbox, DisplaySameTribeKills, DisplayDistance;
int DisplayType;
float DisplayScale, DisplayDelay;
FLinearColor DisplayColour;
FString ServerName;
std::wstring Messages[4];
std::wstring Messages[8];

const float trunc_decs(const float& f, int decs)
{
Expand Down
3 changes: 2 additions & 1 deletion KillFeed/KillFeed/KillFeedConfig.h
Expand Up @@ -10,7 +10,7 @@ void InitConfig()
Log::GetLog()->error("Failed to load config.json");
DisplayType = 0;
DisplayDelay = 5;
DinoKillsEnabled = PlayerKillsEnabled = true;
DisplayDistance = DinoKillsEnabled = PlayerKillsEnabled = true;
return;
}
nlohmann::json TeleportConfig, TempConfig;
Expand All @@ -25,6 +25,7 @@ void InitConfig()
DisplayDelay = TeleportConfig["KillFeed"]["DisplayDelay"];
TempConfig = TeleportConfig["KillFeed"]["DisplayColour"];
DisplayColour = FLinearColor(TempConfig[0], TempConfig[1], TempConfig[2], TempConfig[3]);
DisplayDistance = TeleportConfig["KillFeed"]["DisplayDistance"];
DisplayInChatbox = TeleportConfig["KillFeed"]["DisplayInChatbox"];

TempConfig = TeleportConfig["KillFeed"]["Messages"];
Expand Down
74 changes: 35 additions & 39 deletions KillFeed/KillFeed/KillFeedHooks.h
Expand Up @@ -28,59 +28,53 @@ const FString GetDinoName(APrimalDinoCharacter* Dino)
return DinoName;
}

template <typename T, typename... Args>
void SendChatMessageToAllL(const T* msg, Args&&... args)
{
FChatMessage chat_message = FChatMessage();
chat_message.SenderName = ServerName;
chat_message.Message = FString::Format(msg, std::forward<Args>(args)...);
const auto& player_controllers = ArkApi::GetApiUtils().GetWorld()->PlayerControllerListField()();
for (TWeakObjectPtr<APlayerController> player_controller : player_controllers)
{
AShooterPlayerController* shooter_pc = static_cast<AShooterPlayerController*>(player_controller.Get());
if(shooter_pc) shooter_pc->ClientChatMessage(chat_message);
}
}

template <typename T, typename... Args>
void SendNotificationToAllL(FLinearColor color, float display_scale,
float display_time, UTexture2D* icon, const T* msg, Args&&... args)
{
FString text(FString::Format(msg, std::forward<Args>(args)...));
const auto& player_controllers = ArkApi::GetApiUtils().GetWorld()->PlayerControllerListField()();
for (TWeakObjectPtr<APlayerController> player_controller : player_controllers)
{
AShooterPlayerController* shooter_pc = static_cast<AShooterPlayerController*>(player_controller.Get());
if(shooter_pc) shooter_pc->ClientServerSOTFNotificationCustom(&text, color, display_scale, display_time, icon, nullptr);
}
}

void NotifyDeath(const FString& KillerName, const FString& KillerTribe, const FString& KillerDinoName, const FString& VictimName, const FString& VictimTribe, const FString& WeaponName, UTexture2D* WeaponIcon, float Distance, bool IsPlayer)
{
const bool isKillerDino = !KillerDinoName.IsEmpty();
switch (DisplayType)
{
case 0:
if (isKillerDino) SendNotificationToAllL(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[2].c_str() : Messages[3].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"KillerDinoName", *FString("(" + KillerDinoName + ")")), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName));//, fmt::arg(L"Distance", trunc_decs(Distance, 2)));
else SendNotificationToAllL(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[0].c_str() : Messages[1].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName), fmt::arg(L"WeaponName", *WeaponName));//, fmt::arg(L"Distance", trunc_decs(Distance, 2)));
if (Distance != 0)
{

if (isKillerDino) ArkApi::GetApiUtils().SendNotificationToAll(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[6].c_str() : Messages[7].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"KillerDinoName", *FString("(" + KillerDinoName + ")")), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName), fmt::arg(L"Distance", trunc_decs(Distance, 2)));
else ArkApi::GetApiUtils().SendNotificationToAll(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[4].c_str() : Messages[5].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName), fmt::arg(L"WeaponName", *WeaponName), fmt::arg(L"Distance", trunc_decs(Distance, 2)));
}
else
{
if (isKillerDino) ArkApi::GetApiUtils().SendNotificationToAll(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[2].c_str() : Messages[3].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"KillerDinoName", *FString("(" + KillerDinoName + ")")), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName));
else ArkApi::GetApiUtils().SendNotificationToAll(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[0].c_str() : Messages[1].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName), fmt::arg(L"WeaponName", *WeaponName));
}
break;
case 1:
SendNotificationToAllL(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[2].c_str() : Messages[3].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"KillerDinoName", *(isKillerDino ? FString("(" + KillerDinoName + ")") : FString(""))), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName));//, fmt::arg(L"Distance", trunc_decs(Distance, 2)));
if (Distance != 0) ArkApi::GetApiUtils().SendNotificationToAll(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[6].c_str() : Messages[7].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"KillerDinoName", *(isKillerDino ? FString("(" + KillerDinoName + ")") : FString(""))), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName), fmt::arg(L"Distance", trunc_decs(Distance, 2)));
else ArkApi::GetApiUtils().SendNotificationToAll(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[2].c_str() : Messages[3].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"KillerDinoName", *(isKillerDino ? FString("(" + KillerDinoName + ")") : FString(""))), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName));
break;
case 2:
if (isKillerDino) SendNotificationToAllL(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[2].c_str() : Messages[3].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"KillerDinoName", *FString("(" + KillerDinoName + ")")), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName));//, fmt::arg(L"Distance", trunc_decs(Distance, 2)));
else SendNotificationToAllL(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[0].c_str() : Messages[1].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName), fmt::arg(L"WeaponName", *WeaponName));//, fmt::arg(L"Distance", trunc_decs(Distance, 2)));
if (Distance != 0)
{
if (isKillerDino) ArkApi::GetApiUtils().SendNotificationToAll(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[6].c_str() : Messages[7].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"KillerDinoName", *FString("(" + KillerDinoName + ")")), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName), fmt::arg(L"Distance", trunc_decs(Distance, 2)));
else ArkApi::GetApiUtils().SendNotificationToAll(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[4].c_str() : Messages[5].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName), fmt::arg(L"WeaponName", *WeaponName), fmt::arg(L"Distance", trunc_decs(Distance, 2)));
}
else
{
if (isKillerDino) ArkApi::GetApiUtils().SendNotificationToAll(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[2].c_str() : Messages[3].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"KillerDinoName", *FString("(" + KillerDinoName + ")")), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName));
else ArkApi::GetApiUtils().SendNotificationToAll(DisplayColour, DisplayScale, DisplayDelay, WeaponIcon, (IsPlayer ? Messages[0].c_str() : Messages[1].c_str()), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName), fmt::arg(L"WeaponName", *WeaponName));
}
break;
}

if (DisplayInChatbox)
{
if (isKillerDino)
if (Distance != 0)
{
SendChatMessageToAllL(fmt::format(L"<RichColor Color=\"{}, {}, {}, {}\">{}</>", DisplayColour.R, DisplayColour.G, DisplayColour.B, DisplayColour.A, (IsPlayer ? Messages[2].c_str() : Messages[3].c_str())).c_str(), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"KillerDinoName", *FString("(" + KillerDinoName + ")")), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName));//, fmt::arg(L"Distance", trunc_decs(Distance, 2)));
if (isKillerDino) ArkApi::GetApiUtils().SendChatMessageToAll(ServerName, fmt::format(L"<RichColor Color=\"{}, {}, {}, {}\">{}</>", DisplayColour.R, DisplayColour.G, DisplayColour.B, DisplayColour.A, (IsPlayer ? Messages[6].c_str() : Messages[7].c_str())).c_str(), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"KillerDinoName", *FString("(" + KillerDinoName + ")")), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName), fmt::arg(L"Distance", trunc_decs(Distance, 2)));
else ArkApi::GetApiUtils().SendChatMessageToAll(ServerName, fmt::format(L"<RichColor Color=\"{}, {}, {}, {}\">{}</>", DisplayColour.R, DisplayColour.G, DisplayColour.B, DisplayColour.A, (IsPlayer ? Messages[4].c_str() : Messages[5].c_str())).c_str(), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName), fmt::arg(L"WeaponName", *WeaponName), fmt::arg(L"Distance", trunc_decs(Distance, 2)));
}
else
{
SendChatMessageToAllL(fmt::format(L"<RichColor Color=\"{}, {}, {}, {}\">{}</>", DisplayColour.R, DisplayColour.G, DisplayColour.B, DisplayColour.A, (IsPlayer ? Messages[0].c_str() : Messages[1].c_str())).c_str(), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName), fmt::arg(L"WeaponName", *WeaponName));//, fmt::arg(L"Distance", trunc_decs(Distance, 2)));
if (isKillerDino) ArkApi::GetApiUtils().SendChatMessageToAll(ServerName, fmt::format(L"<RichColor Color=\"{}, {}, {}, {}\">{}</>", DisplayColour.R, DisplayColour.G, DisplayColour.B, DisplayColour.A, (IsPlayer ? Messages[2].c_str() : Messages[3].c_str())).c_str(), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"KillerDinoName", *FString("(" + KillerDinoName + ")")), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName));
else ArkApi::GetApiUtils().SendChatMessageToAll(ServerName, fmt::format(L"<RichColor Color=\"{}, {}, {}, {}\">{}</>", DisplayColour.R, DisplayColour.G, DisplayColour.B, DisplayColour.A, (IsPlayer ? Messages[0].c_str() : Messages[1].c_str())).c_str(), fmt::arg(L"KillerTribe", *(KillerTribe.IsEmpty() ? FString("") : FString("[" + KillerTribe + "]"))), fmt::arg(L"KillerName", *KillerName), fmt::arg(L"VictimTribe", *(VictimTribe.IsEmpty() ? FString("") : FString("[" + VictimTribe + "]"))), fmt::arg(L"VictimName", *VictimName), fmt::arg(L"WeaponName", *WeaponName));
}
}
}
Expand All @@ -105,8 +99,9 @@ bool _cdecl Hook_AShooterCharacter_Die(AShooterCharacter* _this, float KillingDa
if (KillerShooterController->GetPlayerCharacter()->GetRidingDino())
KillerDinoName = GetDinoName(KillerShooterController->GetPlayerCharacter()->GetRidingDino());

//float Distance = (FVector::Distance((_this->RootComponentField()() ? _this->RootComponentField()()->RelativeLocationField()() : FVector(0, 0, 0)), (KillerShooterController->GetPlayerCharacter()->RootComponentField()() ? KillerShooterController->GetPlayerCharacter()->RootComponentField()()->RelativeLocationField()() : FVector(0, 0, 0))) / 220);
NotifyDeath(ArkApi::GetApiUtils().GetCharacterName(KillerShooterController), KillerShooterController->GetPlayerCharacter()->TribeNameField()(), KillerDinoName, _this->PlayerNameField()(), _this->TribeNameField()(), WeaponName, WeaponIcon, 0/*Distance*/, true);
float Distance = 0;
if(DisplayDistance) Distance = (FVector::Distance((_this->RootComponentField()() ? _this->RootComponentField()()->RelativeLocationField()() : FVector(0, 0, 0)), (KillerShooterController->GetPlayerCharacter()->RootComponentField()() ? KillerShooterController->GetPlayerCharacter()->RootComponentField()()->RelativeLocationField()() : FVector(0, 0, 0))) / 220);
NotifyDeath(ArkApi::GetApiUtils().GetCharacterName(KillerShooterController), KillerShooterController->GetPlayerCharacter()->TribeNameField()(), KillerDinoName, _this->PlayerNameField()(), _this->TribeNameField()(), WeaponName, WeaponIcon, Distance, true);
}
}
return AShooterCharacter_Die_original(_this, KillingDamage, DamageEvent, Killer, DamageCauser);
Expand Down Expand Up @@ -134,8 +129,9 @@ bool _cdecl Hook_APrimalDinoCharacter_Die(APrimalDinoCharacter* Dino, float Kill
if (KillerShooterController->GetPlayerCharacter()->GetRidingDino())
KillerDinoName = GetDinoName(KillerShooterController->GetPlayerCharacter()->GetRidingDino());

//float Distance = (FVector::Distance((Dino->RootComponentField()() ? Dino->RootComponentField()()->RelativeLocationField()() : FVector(0, 0, 0)), (KillerShooterController->GetPlayerCharacter()->RootComponentField()() ? KillerShooterController->GetPlayerCharacter()->RootComponentField()()->RelativeLocationField()() : FVector(0, 0, 0))) / 220);
NotifyDeath(ArkApi::GetApiUtils().GetCharacterName(KillerShooterController), KillerShooterController->GetPlayerCharacter()->TribeNameField()(), KillerDinoName, DinoName, Dino->TribeNameField()(), WeaponName, WeaponIcon, 0/*Distance*/, false);
float Distance = 0;
if (DisplayDistance) Distance = (FVector::Distance((Dino->RootComponentField()() ? Dino->RootComponentField()()->RelativeLocationField()() : FVector(0, 0, 0)), (KillerShooterController->GetPlayerCharacter()->RootComponentField()() ? KillerShooterController->GetPlayerCharacter()->RootComponentField()()->RelativeLocationField()() : FVector(0, 0, 0))) / 220);
NotifyDeath(ArkApi::GetApiUtils().GetCharacterName(KillerShooterController), KillerShooterController->GetPlayerCharacter()->TribeNameField()(), KillerDinoName, DinoName, Dino->TribeNameField()(), WeaponName, WeaponIcon, Distance, false);
}
}
return APrimalDinoCharacter_Die_original(Dino, KillingDamage, DamageEvent, Killer, DamageCauser);
Expand Down
14 changes: 10 additions & 4 deletions KillFeed/config.json
Expand Up @@ -3,6 +3,7 @@
"ServerName":"ServerNameHere",
"PlayerKillsEnabled":true,
"TamedDinoKillsEnabled":true,
"DisplaySameTribeKills":false,
"DisplayType":0,
"DisplayScale":1.0,
"DisplayDelay":10,
Expand All @@ -12,12 +13,17 @@
0.8,
1.0
],
"DisplayDistance":false,
"DisplayInChatbox":true,
"Messages":[
"{}{} Killed {}{} with a {} at {}m",
"{}{} Killed Dino: {}{} with a {} at {}m",
"{}{}{} Killed {}{} at {}m",
"{}{}{} Killed Dino: {}{} at {}m"
"{KillerTribe}{KillerName} Killed {VictimTribe}{VictimName} with a {WeaponName}",
"{KillerTribe}{KillerName} Killed Dino: {VictimTribe}{VictimName} with a {WeaponName}",
"{KillerTribe}{KillerName}{KillerDinoName} Killed {VictimTribe}{VictimName}",
"{KillerTribe}{KillerName}{KillerDinoName} Killed Dino: {VictimTribe}{VictimName}",
"{KillerTribe}{KillerName} Killed {VictimTribe}{VictimName} with a {WeaponName} at {Distance}m",
"{KillerTribe}{KillerName} Killed Dino: {VictimTribe}{VictimName} with a {WeaponName} at {Distance}m",
"{KillerTribe}{KillerName}{KillerDinoName} Killed {VictimTribe}{VictimName} at {Distance}m",
"{KillerTribe}{KillerName}{KillerDinoName} Killed Dino: {VictimTribe}{VictimName} at {Distance}m"
]
}
}

0 comments on commit ecf8bc2

Please sign in to comment.