//************************************************************************************* //************************************************************************************* void ARX_SCRIPT_ResetObject(Entity * io, bool init) { if(!io) return; // Now go for Script INIT/RESET depending on Mode EntityHandle num = io->index(); if(entities[num] && entities[num]->script.data) { entities[num]->script.allowevents = 0; if(init) ScriptEvent::send(&entities[num]->script, SM_INIT, "", entities[num], ""); if(entities[num]) ARX_SCRIPT_SetMainEvent(entities[num], "main"); } // Do the same for Local Script if(entities[num] && entities[num]->over_script.data) { entities[num]->over_script.allowevents = 0; if(init) ScriptEvent::send(&entities[num]->over_script, SM_INIT, "", entities[num], ""); } // Sends InitEnd Event if(init) { if(entities[num] && entities[num]->script.data) ScriptEvent::send(&entities[num]->script, SM_INITEND, "", entities[num], ""); if(entities[num] && entities[num]->over_script.data) ScriptEvent::send(&entities[num]->over_script, SM_INITEND, "", entities[num], ""); } if(entities[num]) entities[num]->gameFlags &= ~GFLAG_NEEDINIT; }
void ARX_DAMAGES_ForceDeath(Entity * io_dead, Entity * io_killer) { if(io_dead->mainevent == "dead") { return; } Entity * old_sender = EVENT_SENDER; EVENT_SENDER = io_killer; if(io_dead == DRAGINTER) Set_DragInter(NULL); if(io_dead == FlyingOverIO) FlyingOverIO = NULL; if((MasterCamera.exist & 1) && (MasterCamera.io == io_dead)) MasterCamera.exist = 0; if((MasterCamera.exist & 2) && (MasterCamera.want_io == io_dead)) MasterCamera.exist = 0; lightHandleDestroy(io_dead->dynlight); lightHandleDestroy(io_dead->halo.dynlight); //Kill all speeches ARX_NPC_Behaviour_Reset(io_dead); ARX_SPEECH_ReleaseIOSpeech(io_dead); //Kill all Timers... ARX_SCRIPT_Timer_Clear_For_IO(io_dead); if(io_dead->mainevent != "dead") { if(SendIOScriptEvent(io_dead, SM_DIE) != REFUSE && ValidIOAddress(io_dead)) { io_dead->infracolor = Color3f::blue; } } if (!ValidIOAddress(io_dead)) return; ARX_SCRIPT_SetMainEvent(io_dead, "dead"); if(fartherThan(io_dead->pos, ACTIVECAM->orgTrans.pos, 3200.f)) { io_dead->animlayer[0].ctime = 9999999; io_dead->animBlend.lastanimtime = 0; } std::string killer; if(io_dead->ioflags & IO_NPC) io_dead->_npcdata->weaponinhand = 0; ARX_INTERACTIVE_DestroyDynamicInfo(io_dead); if(io_killer == entities.player()) { killer = "player"; } else { if(io_killer) killer = io_killer->idString(); } for(size_t i = 1; i < entities.size(); i++) { const EntityHandle handle = EntityHandle(i); Entity * ioo = entities[handle]; if(ioo == io_dead) continue; if(ioo && (ioo->ioflags & IO_NPC)) { if(ValidIONum(ioo->targetinfo)) if(entities[ioo->targetinfo] == io_dead) { EVENT_SENDER = io_dead; Stack_SendIOScriptEvent(entities[handle], SM_NULL, killer, "target_death"); ioo->targetinfo = EntityHandle(TARGET_NONE); ioo->_npcdata->reachedtarget = 0; } if(ValidIONum(ioo->_npcdata->pathfind.truetarget)) if(entities[ioo->_npcdata->pathfind.truetarget] == io_dead) { EVENT_SENDER = io_dead; Stack_SendIOScriptEvent(entities[handle], SM_NULL, killer, "target_death"); ioo->_npcdata->pathfind.truetarget = EntityHandle(TARGET_NONE); ioo->_npcdata->reachedtarget = 0; } } } io_dead->animlayer[1].cur_anim = NULL; io_dead->animlayer[2].cur_anim = NULL; io_dead->animlayer[3].cur_anim = NULL; if(io_dead->ioflags & IO_NPC) { io_dead->_npcdata->lifePool.current = 0; if(io_dead->_npcdata->weapon) { Entity * ioo = io_dead->_npcdata->weapon; if(ValidIOAddress(ioo)) { ioo->show = SHOW_FLAG_IN_SCENE; ioo->ioflags |= IO_NO_NPC_COLLIDE; ioo->pos = ioo->obj->vertexlist3[ioo->obj->origin].v; ioo->velocity = Vec3f(0.f, 13.f, 0.f); ioo->stopped = 0; } } } EVENT_SENDER = old_sender; }
Entity::Entity(const res::path & classPath, EntityInstance instance) : m_index(size_t(-1)) , m_id(classPath, instance) , m_classPath(classPath) { m_index = entities.add(this); ioflags = 0; lastpos = Vec3f_ZERO; pos = Vec3f_ZERO; move = Vec3f_ZERO; lastmove = Vec3f_ZERO; forcedmove = Vec3f_ZERO; angle = Anglef::ZERO; physics = IO_PHYSICS(); room = -1; requestRoomUpdate = 1; original_height = 0.f; original_radius = 0.f; m_icon = NULL; obj = NULL; std::fill_n(anims, MAX_ANIMS, (ANIM_HANDLE *)NULL); for(size_t l = 0; l < MAX_ANIM_LAYERS; l++) { animlayer[l] = AnimLayer(); } animBlend.m_active = false; animBlend.lastanimtime = ArxInstant_ZERO; std::memset(&bbox3D, 0, sizeof(EERIE_3D_BBOX)); // TODO use constructor bbox2D.min = Vec2f(-1.f, -1.f); bbox2D.max = Vec2f(-1.f, -1.f); tweaky = NULL; sound = audio::INVALID_ID; type_flags = 0; scriptload = 0; target = Vec3f_ZERO; targetinfo = EntityHandle(TARGET_NONE); _itemdata = NULL, _fixdata = NULL, _npcdata = NULL, _camdata = NULL; inventory = NULL; show = SHOW_FLAG_IN_SCENE; collision = 0; infracolor = Color3f::blue; changeanim = -1; weight = 1.f; gameFlags = GFLAG_NEEDINIT | GFLAG_INTERACTIVITY; velocity = Vec3f_ZERO; fall = 0.f; stopped = 1; initpos = Vec3f_ZERO; initangle = Anglef::ZERO; scale = 1.f; usepath = NULL; symboldraw = NULL; dynlight = LightHandle(); lastspeechflag = 2; inzone = NULL; halo = IO_HALO(); halo_native = IO_HALO(); halo_native.color = Color3f(0.2f, 0.5f, 1.f); halo_native.radius = 45.f; halo_native.flags = 0; ARX_HALO_SetToNative(this); stat_count = 0; stat_sent = 0; tweakerinfo = NULL; material = MATERIAL_NONE; m_inventorySize = Vec2s(1, 1); soundtime = ArxInstant_ZERO; soundcount = 0; sfx_time = ArxInstant_ZERO; collide_door_time = ArxInstant_ZERO; ouch_time = ArxInstant_ZERO; dmg_sum = 0.f; spellcast_data = IO_SPELLCAST_DATA(); flarecount = 0; no_collide = EntityHandle(); invisibility = 0.f; frameloss = 0.f; basespeed = 1.f; speed_modif = 0.f; rubber = BASE_RUBBER; max_durability = durability = 100.f; poisonous = 0; poisonous_count = 0; ignition = 0.f; ignit_light = LightHandle(); ignit_sound = audio::INVALID_ID; head_rot = 0.f; damager_damages = 0; damager_type = 0; sfx_flag = 0; secretvalue = -1; shop_multiply = 1.f; isHit = false; inzone_show = 0; summoner = EntityHandle(); spark_n_blood = 0; special_color = Color3f::white; highlightColor = Color3f::black; ARX_SCRIPT_SetMainEvent(this, "main"); }
Entity::Entity(const res::path & classPath) : m_index(size_t(-1)), m_classPath(classPath) { m_index = entities.add(this); ioflags = 0; lastpos = Vec3f_ZERO; pos = Vec3f_ZERO; move = Vec3f_ZERO; lastmove = Vec3f_ZERO; forcedmove = Vec3f_ZERO; angle = Anglef::ZERO; std::memset(&physics, 0, sizeof(IO_PHYSICS)); // TODO use constructor room = -1; room_flags = 1; original_height = 0.f; original_radius = 0.f; inv = NULL; obj = NULL; std::fill_n(anims, MAX_ANIMS, (ANIM_HANDLE *)NULL); std::memset(animlayer, 0, sizeof(ANIM_USE) * MAX_ANIM_LAYERS); // TODO use constructor animBlend.nb_lastanimvertex = 0; animBlend.lastanimtime = 0; std::memset(&bbox3D, 0, sizeof(EERIE_3D_BBOX)); // TODO use constructor bbox2D.min = Vec2f(-1.f, -1.f); bbox2D.max = Vec2f(-1.f, -1.f); tweaky = NULL; sound = audio::INVALID_ID; type_flags = 0; scriptload = 0; target = Vec3f_ZERO; targetinfo = TARGET_NONE; _itemdata = NULL, _fixdata = NULL, _npcdata = NULL, _camdata = NULL; inventory = NULL; show = SHOW_FLAG_IN_SCENE; collision = 0; infracolor = Color3f::blue; changeanim = -1; ident = 0; weight = 1.f; gameFlags = GFLAG_NEEDINIT | GFLAG_INTERACTIVITY; velocity = Vec3f_ZERO; fall = 0.f; stopped = 1; initpos = Vec3f_ZERO; initangle = Anglef::ZERO; scale = 1.f; usepath = NULL; symboldraw = NULL; dynlight = -1; lastspeechflag = 2; inzone = NULL; std::memset(&halo, 0, sizeof(IO_HALO)); // TODO use constructor std::memset(&halo_native, 0, sizeof(IO_HALO)); // TODO use constructor halo_native.color = Color3f(0.2f, 0.5f, 1.f); halo_native.radius = 45.f; halo_native.flags = 0; halo_native.dynlight = -1; ARX_HALO_SetToNative(this); halo.dynlight = -1; std::memset(&script, 0, sizeof(EERIE_SCRIPT)); // TODO use constructor std::memset(&over_script, 0, sizeof(EERIE_SCRIPT)); // TODO use constructor stat_count = 0; stat_sent = 0; tweakerinfo = NULL; material = MATERIAL_NONE; sizex = 1; sizey = 1; soundtime = 0; soundcount = 0; sfx_time = 0; collide_door_time = 0; ouch_time = 0; dmg_sum = 0.f; std::memset(&spellcast_data, 0, sizeof(IO_SPELLCAST_DATA)); flarecount = 0; no_collide = -1; invisibility = 0.f; basespeed = 1.f; speed_modif = 0.f; spells_on = NULL; nb_spells_on = 0; damagedata = -1; rubber = BASE_RUBBER; max_durability = durability = 100.f; poisonous = 0; poisonous_count = 0; ignition = 0.f; ignit_light = -1; ignit_sound = audio::INVALID_ID; head_rot = 0.f; damager_damages = 0; damager_type = 0; sfx_flag = 0; secretvalue = -1; shop_multiply = 1.f; isHit = false; inzone_show = 0; summoner = 0; spark_n_blood = 0; special_color = Color3f::white; highlightColor = Color3f::black; ARX_SCRIPT_SetMainEvent(this, "main"); }