110 lines
2.2 KiB
ActionScript
110 lines
2.2 KiB
ActionScript
import regions.regions;
|
|
import oddity_navigation;
|
|
import oddities;
|
|
|
|
tidy class OddityScript {
|
|
StrategicIconNode@ icon;
|
|
bool gate = false;
|
|
double timer = -1.0;
|
|
uint visualType = uint(-1);
|
|
uint visualColor = 0xffffffff;
|
|
Object@ link;
|
|
|
|
bool isGate() {
|
|
return gate;
|
|
}
|
|
|
|
vec3d getGateDest() {
|
|
if(link !is null)
|
|
return link.position;
|
|
return vec3d();
|
|
}
|
|
|
|
Object@ getLink() {
|
|
return link;
|
|
}
|
|
|
|
double getTimer() {
|
|
return timer;
|
|
}
|
|
|
|
vec3d get_strategicIconPosition(Oddity& obj) {
|
|
if(icon is null)
|
|
return obj.position;
|
|
return icon.position;
|
|
}
|
|
|
|
void _read(Oddity& obj, Message& msg) {
|
|
uint prevVisual = visualType;
|
|
bool prevGate = gate;
|
|
|
|
msg >> gate;
|
|
msg >> timer;
|
|
msg >> visualType;
|
|
msg >> visualColor;
|
|
msg >> link;
|
|
|
|
if(prevVisual == uint(-1) && visualType != uint(-1)) {
|
|
if(link !is null)
|
|
obj.rotation = quaterniond_fromVecToVec(vec3d_front(), (link.position - obj.position).normalized(), vec3d_up());
|
|
makeVisuals(obj, visualType, color=visualColor);
|
|
}
|
|
|
|
if(gate != prevGate) {
|
|
if(gate)
|
|
addOddityGate(obj);
|
|
else
|
|
removeOddityGate(obj);
|
|
}
|
|
}
|
|
|
|
double tick(Oddity& obj, double time) {
|
|
//Handle region changes
|
|
Region@ prevRegion = obj.region;
|
|
if(updateRegion(obj)) {
|
|
Region@ newRegion = obj.region;
|
|
if(icon !is null) {
|
|
if(prevRegion !is null)
|
|
prevRegion.removeStrategicIcon(-1, icon);
|
|
if(newRegion !is null)
|
|
newRegion.addStrategicIcon(-1, obj, icon);
|
|
}
|
|
@prevRegion = newRegion;
|
|
}
|
|
|
|
//Handle timer
|
|
if(timer > 0.0)
|
|
timer = max(timer - time, 0.0);
|
|
return 0.25;
|
|
}
|
|
|
|
void syncInitial(Oddity& obj, Message& msg) {
|
|
_read(obj, msg);
|
|
}
|
|
|
|
void syncDelta(Oddity& obj, Message& msg, double tDiff) {
|
|
if(msg.readBit())
|
|
_read(obj, msg);
|
|
}
|
|
|
|
void syncDetailed(Oddity& obj, Message& msg, double tDiff) {
|
|
_read(obj, msg);
|
|
}
|
|
|
|
void makeVisuals(Oddity& obj, uint type, bool fromCreation = true, uint color = 0xffffffff) {
|
|
visualType = type;
|
|
@icon = makeOddityVisuals(obj, type, fromCreation, color=color);
|
|
}
|
|
|
|
void destroy(Oddity& obj) {
|
|
if(obj.region !is null)
|
|
obj.region.removeStrategicIcon(-1, icon);
|
|
if(icon !is null)
|
|
icon.markForDeletion();
|
|
leaveRegion(obj);
|
|
if(gate)
|
|
removeOddityGate(obj);
|
|
removeAmbientSource(obj.id);
|
|
}
|
|
};
|