-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathTransformation.cpp
112 lines (98 loc) · 3.88 KB
/
Transformation.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "Transformation.h"
#include "GameAPI.h"
#include "GameForms.h"
#include "GameObjects.h"
std::string transf_path = "Data\\OBSE\\Plugins\\Transformations";
std::string skeletons_path = "Data\\Meshes\\Characters\\_male\\";
static std::vector<Transformation*>* transform_list = NULL;
static std::forward_list<TransformNPC*>* npc_list = NULL;
InterfaceManager* interface_singleton = InterfaceManager::GetSingleton();
PlayerCharacter* playerChar = *g_thePlayer;
void HandleTransforms(void) {
if (interface_singleton->IsGameMode() == 0) return; //Don't operate the mainloop if not in GameMode
for each (TransformNPC* var in *npc_list){
if (!var->isPlayer) _MESSAGE("[WARN] NON Player still not handled");
if (var->transform->type == TransformType::Transform_Automatic) _MESSAGE("[WARN] Automatic transformation still not handled\n");
if (var->transform->type == TransformType::Transform_Trigger) _MESSAGE("[WARN] Trigger transformation still not handled\n");
_MESSAGE("Start transform\n");
std::string s = skeletons_path + var->transform->skeletonSubs;
var->oldNpc.old_skeleton = ((TESNPC*)playerChar->baseForm)->model.GetModelPath();
if (playerChar->SetSkeletonPath(s.data()) == false) {
_MESSAGE("[ERROR] Transformation cannot complete. Could not set Skeleton");
//TODO remove from the list of NPC transform.
continue;
}
_MESSAGE("End transform");
}
}
bool InitTransformations(void) {
transform_list = new std::vector<Transformation*>();
npc_list = new std::forward_list<TransformNPC*>();
//TODO initialize transformations reading from a file.
//Hardcoding for now
Transformation* werewolf = new Transformation();
werewolf->name = "werewolf";
werewolf->skeletonSubs = "skeleton_werewolf.nif"; //Relative to Data\Meshes\Characters\_male
transform_list->push_back(werewolf);
}
void RegisterWerewolf(TESObjectREFR* actor){
TESNPC* act = (TESNPC*)Oblivion_DynamicCast(actor->GetBaseForm(),0, RTTI_TESForm, RTTI_TESNPC,0);
if(!act) return;
TransformNPC* tr = new TransformNPC();
tr->transform = transform_list->at(0);
//TODO only one transformation present.
//TODO prevent registrating an already present actor.
tr->ESPID = actor->GetModIndex();
tr->RefID = actor->refID;
tr->actorRef = actor;
if (tr->ESPID == 00 && tr->RefID == 0x000014) {
tr->isPlayer = true;
_MESSAGE("[INFO] Registering the player\n");
}
else {
tr->isPlayer = false;
_MESSAGE("[INFO] Registerin NPC\n");
}
npc_list->push_front(tr);
}
void UnregisterWerewolf(TESObjectREFR* actor) {
TESNPC* act = (TESNPC*)Oblivion_DynamicCast(actor->GetBaseForm(), 0, RTTI_TESForm, RTTI_TESNPC, 0);
if (!act) return;
TransformNPC* tr_act = NULL;
for each (TransformNPC* var in *npc_list) {
if (var->ESPID == actor->GetModIndex() && var->RefID == actor->refID) {
tr_act = var;
break;
}
}
npc_list->remove(tr_act);
//TODO enque and defer untransform before freeing resources
}
bool Transform(TESObjectREFR* actor) {
TESNPC* act = (TESNPC*)Oblivion_DynamicCast(actor->GetBaseForm(), 0, RTTI_TESForm, RTTI_TESNPC, 0);
if (!act) return false;
TransformNPC* tr_act = NULL;
for each (TransformNPC* var in *npc_list) {
if (var->ESPID == actor->GetModIndex() && var->RefID == actor->refID) {
tr_act = var;
break;
}
}
if (tr_act == NULL) return false; //Reference is unregistered
tr_act->status = TransformStatus::StatusTransform; //Enqueue the Reference for transforming
return true;
}
bool UnTransform(TESObjectREFR* actor) {
TESNPC* act = (TESNPC*)Oblivion_DynamicCast(actor->GetBaseForm(), 0, RTTI_TESForm, RTTI_TESNPC, 0);
if (!act) return false;
TransformNPC* tr_act = NULL;
for each (TransformNPC* var in *npc_list) {
if (var->ESPID == actor->GetModIndex() && var->RefID == actor->refID) {
tr_act = var;
break;
}
}
if (tr_act == NULL) return false; //Reference is unregistered
tr_act->status = TransformStatus::StatusUnTransform; //Enqueue the Reference for Untransforming
return true;
}