Skip to content

Commit

Permalink
Fix actor base must tick before actor
Browse files Browse the repository at this point in the history
  • Loading branch information
dpjudas committed Jul 18, 2024
1 parent 7689c48 commit e1dc7c3
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 34 deletions.
12 changes: 5 additions & 7 deletions SurrealEngine/UObject/UActor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -348,10 +348,8 @@ void UActor::SetBase(UActor* newBase, bool sendBaseChangeEvent)
}
}

void UActor::Tick(float elapsed, bool tickedFlag)
void UActor::Tick(float elapsed)
{
bTicked() = tickedFlag;

TickAnimation(elapsed);

if (Role() >= ROLE_SimulatedProxy && IsEventEnabled(EventName::Tick))
Expand Down Expand Up @@ -2157,7 +2155,7 @@ void UPawn::UpdateActorZone()
PlayerReplicationInfo()->PlayerZone() = Region().Zone;
}

void UPawn::Tick(float elapsed, bool tickedFlag)
void UPawn::Tick(float elapsed)
{
MoveTimer() -= elapsed;

Expand Down Expand Up @@ -2233,7 +2231,7 @@ void UPawn::Tick(float elapsed, bool tickedFlag)
}
}

UActor::Tick(elapsed, tickedFlag);
UActor::Tick(elapsed);

if (bIsPlayer() && Role() >= ROLE_AutonomousProxy)
{
Expand Down Expand Up @@ -2429,9 +2427,9 @@ float UPawn::GetSpeed()

/////////////////////////////////////////////////////////////////////////////

void UPlayerPawn::Tick(float elapsed, bool tickedFlag)
void UPlayerPawn::Tick(float elapsed)
{
UPawn::Tick(elapsed, tickedFlag);
UPawn::Tick(elapsed);

if (Role() >= ROLE_SimulatedProxy)
{
Expand Down
6 changes: 3 additions & 3 deletions SurrealEngine/UObject/UActor.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ class UActor : public UObject
virtual void UpdateActorZone();
PointRegion FindRegion(const vec3& offset = vec3(0.0f));

virtual void Tick(float elapsed, bool tickedFlag);
virtual void Tick(float elapsed);

void TickAnimation(float elapsed);

Expand Down Expand Up @@ -1388,7 +1388,7 @@ class UPawn : public UActor
public:
using UActor::UActor;

void Tick(float elapsed, bool tickedFlag) override;
void Tick(float elapsed) override;
void TickRotating(float elapsed) override;

void InitActorZone() override;
Expand Down Expand Up @@ -1572,7 +1572,7 @@ class UPlayerPawn : public UPawn
public:
using UPawn::UPawn;

void Tick(float elapsed, bool tickedFlag) override;
void Tick(float elapsed) override;
void TickRotating(float elapsed) override;

float& AppliedBob() { return Value<float>(PropOffsets_PlayerPawn.AppliedBob); }
Expand Down
12 changes: 6 additions & 6 deletions SurrealEngine/UObject/UInternetLink.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ UInternetLink::~UInternetLink()
Thread.join();
}

void UInternetLink::Tick(float elapsed, bool tickedFlag)
void UInternetLink::Tick(float elapsed)
{
UInternetInfo::Tick(elapsed, tickedFlag);
UInternetInfo::Tick(elapsed);

std::unique_lock<std::mutex> lock(Mutex);
IpAddr resolvedAddr = ResolvedAddr;
Expand Down Expand Up @@ -151,9 +151,9 @@ UTcpLink::~UTcpLink()
closesocket(handle);
}

void UTcpLink::Tick(float elapsed, bool tickedFlag)
void UTcpLink::Tick(float elapsed)
{
UInternetLink::Tick(elapsed, tickedFlag);
UInternetLink::Tick(elapsed);

// event ReceivedText(string Text);
// event ReceivedLine(string Line);
Expand Down Expand Up @@ -232,9 +232,9 @@ UUdpLink::~UUdpLink()
closesocket(handle);
}

void UUdpLink::Tick(float elapsed, bool tickedFlag)
void UUdpLink::Tick(float elapsed)
{
UInternetLink::Tick(elapsed, tickedFlag);
UInternetLink::Tick(elapsed);

// int result = recvfrom(handle, (char*)data, size, 0, (sockaddr *)&addr, &addr_len);

Expand Down
6 changes: 3 additions & 3 deletions SurrealEngine/UObject/UInternetLink.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class UInternetLink : public UInternetInfo
using UInternetInfo::UInternetInfo;
~UInternetLink();

void Tick(float elapsed, bool tickedFlag) override;
void Tick(float elapsed) override;

int GetLastError();
IpAddr GetLocalIP();
Expand Down Expand Up @@ -63,7 +63,7 @@ class UTcpLink : public UInternetLink
UTcpLink(NameString name, UClass* base, ObjectFlags flags);
~UTcpLink();

void Tick(float elapsed, bool tickedFlag) override;
void Tick(float elapsed) override;

int BindPort(int Port, bool bUseNextAvailable);
bool Listen();
Expand Down Expand Up @@ -93,7 +93,7 @@ class UUdpLink : public UInternetLink
UUdpLink(NameString name, UClass* base, ObjectFlags flags);
~UUdpLink();

void Tick(float elapsed, bool tickedFlag) override;
void Tick(float elapsed) override;

int BindPort(int Port, bool bUseNextAvailable);

Expand Down
49 changes: 34 additions & 15 deletions SurrealEngine/UObject/ULevel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,26 +81,45 @@ void ULevel::Load(ObjectStream* stream)
}
}

void ULevel::TickActor(float elapsed, UActor* actor)
{
if (!actor)
return;

// If we have an owner, tick it first
if (!actor->bDeleteMe() && actor->Owner())
{
TickActor(elapsed, actor->Owner());
}

// Do we have an actor? is it deleted? did it already tick?
if (actor->bDeleteMe() || actor->bTicked() == ticked)
return;

// Mark actor as ticked
actor->bTicked() = ticked;

// Tick the actor for this turn
actor->Tick(elapsed);

// Destroy the actor if its time
if (actor->Role() >= ROLE_SimulatedProxy && actor->LifeSpan() != 0.0f)
{
actor->LifeSpan() = std::max(actor->LifeSpan() - elapsed, 0.0f);
if (actor->LifeSpan() == 0.0f)
{
CallEvent(actor, EventName::Expired);
actor->Destroy();
}
}
}

void ULevel::Tick(float elapsed)
{
// To do: owned actors must tick before their children:
for (size_t i = 0; i < Actors.size(); i++)
{
UActor* actor = Actors[i];
if (actor)
{
actor->Tick(elapsed, ticked);

if (actor->Role() >= ROLE_SimulatedProxy && actor->LifeSpan() != 0.0f)
{
actor->LifeSpan() = std::max(actor->LifeSpan() - elapsed, 0.0f);
if (actor->LifeSpan() == 0.0f)
{
CallEvent(actor, EventName::Expired);
actor->Destroy();
}
}
}
TickActor(elapsed, Actors[i]);
}

Array<UActor*> newActorList;
Expand Down
2 changes: 2 additions & 0 deletions SurrealEngine/UObject/ULevel.h
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,8 @@ class ULevel : public ULevelBase
std::map<std::string, std::string> TravelInfo;

private:
void TickActor(float elapsed, UActor* actor);

bool ticked = false;
};

Expand Down

0 comments on commit e1dc7c3

Please sign in to comment.