Перейти к контенту

[SoC] Ковыряемся в файлах


Рекомендуемые сообщения

@Змея, не в кастом-дате, а в нет-пакете. По идее нет, но читал где-то на форуме, что были проблемы со смартами из-за рестриктора, то ли ин-, то ли аут-, на месте смарта - неписи так же разбегались.

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

Ребят, тут мод скачал https://goo.gl/K73TMj но есть проблема в нем одна автор мода поломал инвентарь в bind_monster инвентарь монстров* он отрывается только если убить мутанта а затем сделать Save и Load ну вы поняли и еще он всегда пуст как можно решить эту проблему я в свой мод вставил а тут такое кто поможет тому спасибо от души и когда доработаю мод не забуду указать помощь) 


-----------------------------------------------------------------------------------
-- Monster binding
-----------------------------------------------------------------------------------

Скрытый текст

 

local particles={}
local table_enemy_cont = {}
local rand = math.random(1,100)
local BurerNum
local BurerTimer = 0
local song_start_sucks = xr_sound.get_safe_sound_object("monsters\\bloodsucker\\vampire_sucking")

function bind(obj)
    printf("_bp: monster.bind: name='%s', id='%d'", obj:name(), obj:id())

    -- Для спауна
    --xr_spawner.spawn_client(obj)

    local new_binder = generic_object_binder(obj)
    obj:bind_object(new_binder)
end

------------------------------------------------------------------------------------
class "generic_object_binder" (object_binder)

function generic_object_binder:__init(obj) super(obj)
    self.loaded = false
    self.particles = {}
    self.MutantManager = ogsm_mutants.MutantManager()
    self.chtime = 0
    self.last_update = 0
    self.start_anim_hit_cont = false
    self.start_anim_hit_blood = false
    self.start_hit = false
end 

function generic_object_binder:reload(section)
    object_binder.reload(self, section)
end

function generic_object_binder:reinit()
    object_binder.reinit(self)

    -- У торговца нет поддержки перемещения
    if self.object:clsid() ~= clsid.script_trader then
        self.object:set_patrol_extrapolate_callback(generic_object_binder.extrapolate_callback, self)
    end

    db.storage[self.object:id()] = { }

    self.st = db.storage[self.object:id()]

    self.object:set_callback(callback.patrol_path_in_point, self.waypoint_callback, self)
    self.object:set_callback(callback.hit,                    self.hit_callback,        self)
    self.object:set_callback(callback.death,                self.death_callback,    self)
end

function generic_object_binder:update(delta)

    if string.find(self.object:name(), "crow_") then
        return false
    end

    object_binder.update(self, delta)

    if particles[self.object:id()] and table.getn(particles[self.object:id()])>0 then
        for kk,vv in pairs(particles[self.object:id()]) do
--            amk.mylog("particle found")
            table.insert(self.particles,amk_particle.amk_particle(vv))
            table.remove(particles[self.object:id()],kk)
        end
    end
        
    if table.getn(self.particles)>0 then
        for kk,vv in pairs(self.particles) do
            if vv:is_finished() then
                self.particles[kk]=nil
            else
                vv:update(delta)
            end
        end
    end


--    printf("_bp: generic_object_binder: UPDATE [name='%s' time=%d]",
--        self.object:name(), time_global())

    -- Апдейт торговли
    if self.object:clsid() == clsid.script_trader then
        trade_manager.update(self.object)
    end

    if self.object:clsid() == clsid.controller_s and self.object:alive() == true and time_global()>(self.upd_time or 0) then
        self.upd_time = time_global() + 1500
        local dist = self.object:position():distance_to(db.actor:position())
        if dist < 50 then
            if math.random()<(dist*0.1) then
                if phantom_manager.phantom_count()<5 then
                    local yaw = math.pi*2.0*math.random()
                    local radius = 30*(math.random()/2.0+0.5)
                    local height = 2.5*math.random()
                    local a_pos = db.actor:position()
                    local pos = vector():set(math.sin(yaw)*radius+a_pos.x,a_pos.y+height,math.cos(yaw)*radius+a_pos.z)
                    phantom_manager.spawn_phantom(pos)
                end
            end
        end
    end

    if self.object:alive() then
        if self.object:is_talk_enabled() then
            self.object:set_tip_text("character_use")
        else
            self.object:set_tip_text("")
        end
        
        -- Удар контролёра руками из Зова Припяти (Автор: demover123)
        if self.object:clsid() == clsid.controller_s then
            local target = self.object:get_enemy()
            if target and self.object:see(target) and IsStalker(target) then
                local dist = self.object:position():distance_to(target:position())
                if dist <= 1.7 then
                    if not self.get_hit then
                        self.get_hit = time_global() + 100
                        self.start_anim_hit_cont = true
                    elseif self.get_hit <= time_global() then
                        if self.start_anim_hit_cont then
                            if self.object:animation_count() > 0 then
                                self.object:clear_animations()
                            end
                            self.object:play_cycle("stand_attack_1", true)
                            
                            local song_start = xr_sound.get_safe_sound_object("monsters\\controller\\controller_hit_2")
                            song_start:play_at_pos(self.object, self.object:position(), sound_object.s3d)
                            self.start_anim_hit_cont = false
                        end
                        if not self.hit_to_enemy then
                            self.hit_to_enemy = time_global() + 300
                        elseif self.hit_to_enemy <= time_global() then
                            level.add_cam_effector("camera_effects\\hit_back_left.anm", 777, false, "")
                            
                            local h = hit()
                            h.draftsman = self.object
                            h.direction = vector():set(0,0,0)  
                            h:bone("bip01_spine")   
                            h.power     = 0.40     
                            h.impulse   = 1
                            h.type      = hit.wound
                            target:hit(h)
                            
                            self.hit_to_enemy = nil
                            self.get_hit = nil
                        end
                    end
                else
                    self.hit_to_enemy = nil
                    self.get_hit = nil
                end
            end
            if self.object:animation_count() < 1 then
                local i = math.random(0,5)
                self.object:add_animation("stand_walk_fwd_"..i, true)
            end
        end
        
        -- Новое повидение кровососа (Автор: demover123)
        if self.object:clsid() == clsid.bloodsucker_s then
            local target = self.object:get_enemy()
            if target and self.object:see(target) and (IsStalker(target) or IsMonster(target)) then
                local dist = self.object:position():distance_to(target:position())
                if dist < 1.5 then
                    if not self.sucks and not self.steal then
                        rand = math.random(0,100)
                        if rand > 90 then
                            if self.object.health < 1.0 then
                                self.sucks = true
                            end
                        elseif rand < 90 and rand > 70 then
                            local active_slot = db.actor:active_slot()
                            if active_slot==1 or active_slot==2 then
                                self.steal = true
                            end
                        end
                    end
                    
                    if self.steal then
                        if not self.start_steal then
                            self.object:set_invisible(false)
                            self.object:play_cycle("!stand_attack_1", true)
                            local song_steal = xr_sound.get_safe_sound_object("monsters\\bloodsucker\\hit_"..math.random(0,3))
                            if not song_steal:playing() then
                                song_steal:play_at_pos(self.object, self.object:position(), sound_object.s3d)
                            end
                            self.start_steal = time_global() + 400
                        end
                        if self.start_steal <= time_global() then
                            db.actor:drop_item(db.actor:active_item())
                            local h = hit()
                            h.draftsman = self.object
                            h.direction = vector():set(0,0,0)  
                            h:bone("bip01_spine")   
                            h.power     = 0.10     
                            h.impulse   = 1
                            h.type      = hit.wound
                            target:hit(h)
                            self.start_steal = nil
                            self.steal = false
                            self.object:set_invisible(true)
                        end
                    end
                    
                    if self.sucks then
                        if self.object:animation_count() > 0 then
                            self.object:clear_animations()
                        end
                        if not self.bool_vamp_0 then
                            db.actor:hide_weapon()
                            self.object:set_invisible(false)
                            level.disable_input()
                            level.hide_indicators()
                            target:set_actor_direction(-self.object:position():sub(target:position()):getH())
                            self.object:play_cycle("vampire_0", true)
                            self.bool_vamp_0 = true
                        end
                        if not self.first_step then
                            self.first_step = time_global() + 1000
                        elseif self.first_step and self.first_step <= time_global() then
                            if self.object:animation_count() > 0 then
                                self.object:clear_animations()
                            end
                            if not self.bool_vamp_1 then
                                self.object:set_invisible(false)
                                self.object:play_cycle("vampire_1", true)
                                level.add_pp_effector("escape.ppe",778,true)
                                song_start_sucks:play_at_pos(self.object, self.object:position(), sound_object.s3d)
                                self.bool_vamp_1 = true
                            end
                            if not self.bool_next_step then
                                self.second_step = time_global() + 2000
                                self.bool_next_step = true
                            end
                            
                            if self.second_step <= time_global() then
                                self.object:position():sub(target:position()):normalize()
                                
                                if not self.ending_sucks then
                                    self.ending_sucks = time_global() + 700
                                    self.object:set_invisible(false)
                                    local song_start = xr_sound.get_safe_sound_object("monsters\\bloodsucker\\vampire_hit")
                                    song_start:play_at_pos(self.object, self.object:position(), sound_object.s3d)
                                    self.object:play_cycle("vampire_2", true)
                                end
                                
                                if self.ending_sucks <= time_global() then
                                        
                                    level.add_cam_effector("camera_effects\\hit_back_right.anm", 779, false, "")
                                        
                                    local h = hit()
                                    h.draftsman = self.object
                                    h.direction = vector():set(0,0,0)  
                                    h:bone("bip01_spine")   
                                    h.power     = 0.40     
                                    h.impulse   = 1
                                    h.type      = hit.wound
                                    target:hit(h)
                                    
                                    self.object.health = self.object.health + 0.1
                                    
                                    db.actor:restore_weapon()
                                    
                                    level.remove_pp_effector(778)
                                    
                                    self.sucks = false
                                    self.first_step = nil
                                    self.second_step = nil
                                    self.bool_next_step = false
                                    self.bool_vamp_0 = false
                                    self.bool_vamp_1 = false
                                    self.object:set_invisible(true)
                                    rand = math.random(1,100)
                                    
                                    level.enable_input()
                                    level.show_indicators()
                                    
                                    self.ending_sucks = nil
                                end
                            end
                        end
                    end
                else 
                    if self.sucks then
                        db.actor:restore_weapon()
                        level.remove_pp_effector(778)
                        
                        self.object:clear_animations()
                        
                        self.object:set_invisible(true)
                        self.object:set_invisible(false)
                                    
                        if song_start_sucks:playing() then
                            song_start_sucks:stop()
                        end
                                    
                        self.sucks = false
                        self.first_step = nil
                        self.second_step = nil
                        self.bool_next_step = false
                        self.bool_vamp_0 = false
                        self.bool_vamp_1 = false
                        level.enable_input()
                        level.show_indicators()
                    elseif self.steal then
                        self.steal = false
                    end
                end
            end    
            if target and not self.object:see(target) then
                local dist = self.object:position():distance_to(target:position())
                if dist < 20 then
                    if not self.time_to_boogie then
                        self.time_to_boogie = time_global() + (math.random(5,10) * 1000)
                    end
                    if self.time_to_boogie <= time_global() then
                        self.object:set_invisible(false)
                        self.object:play_cycle("stand_threaten_0", true)
                        local song_boogie = xr_sound.get_safe_sound_object("monsters\\bloodsucker\\bloodsucker_script_attack_"..math.random(0,1))
                        if not song_boogie:playing() then
                            song_boogie:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 3.0)
                        end
                        if not self.gotoinvis then
                            self.gotoinvis = true
                        else
                            self.object:set_invisible(true)
                            self.time_to_boogie = nil
                            self.gotoinvis = false
                        end
                    end
                end
            end
        end
        
        -- Атака бюрера из Зова Припяти (Авторы: Shadows and Charsi and demover123)
        if self.object:clsid()==clsid.burer_s and BurerTimer < time_global() then
            local target = self.object:get_enemy()
            local v1 = self.object:direction()
            local v2 = db.actor:direction()
            if target and (target:id()==0) and (v1.x*v2.x)+(v1.z*v2.z)<-0.6 and self.object:see(db.actor) and self.object:position():distance_to(db.actor:position())<6 then
                BurerNum = 1
                db.actor.power = -1.0
                local active_slot = db.actor:active_slot()
                if active_slot==1 or active_slot==2 then
                    db.actor:drop_item(db.actor:active_item())
                    self.object:play_cycle("stand_attack_0", false)
                end
                BurerTimer = time_global() + 6000*(1+math.random(-0.2,0.2))
                self.object:add_animation("stand_idle_"..math.random(0,2), true)
            elseif BurerNum and BurerTimer < time_global() + 6000 then
                self.object:add_animation("stand_idle_"..math.random(0,2), true)
                BurerNum = nil
            end
        end
        
        -- Химера ищет жертву стоя на задних лапах идея была взята из одного квеста в Зове Припяти (Автор: demover123)
        if self.object:clsid()==clsid.chimera_s then
            local target = self.object:get_enemy()
            if target and not self.object:see(target) and IsStalker(target) then
                local dist = self.object:position():distance_to(target:position())
                if dist < 10 then
                    if not self.find then
                        if self.object:animation_count() > 0 then
                            self.object:clear_animations()
                        end
                        self.object:play_cycle("look_around_0", false)
                        if not self.time_to_next_find then
                            self.time_to_next_find = time_global() + 4000
                        end
                        self.find = true
                    else
                        if self.time_to_next_find <= time_global() then
                            self.find = false
                            self.time_to_next_find = nil
                        end
                    end
                end
            end
        end
        
    else
        self.object:set_tip_text_default()
    end

   if IsMonster(self.object) and time_global() - self.last_update > 1000 then
            if self.object:alive() and self.object.health>0.01 then
                if self.object:see(db.actor) and db.actor:position():distance_to(self.object:position())<80*80 then amk.enemy_see_actor(self.object,"monster") end
                if db.actor:see(self.object) and db.actor:position():distance_to(self.object:position())<80*80 then amk.actor_see_enemy(self.object,"monster") end
            end
      self.last_update = time_global()
        end

    self.MutantManager:update(self.object)

    if self.st.active_section ~= nil then
        xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "update", delta)
    end
end

function generic_object_binder:extrapolate_callback()
    local cur_pt = self.object:get_current_point_index()

    if self.object:get_script ()    == false then 
       return false
    end    
    
    if patrol(self.object:patrol()):flags(cur_pt):get() == 0 then
        --printf("_bp: generic_object_binder: extrapolate_callback: cur_pt = %d: true", cur_pt)
        return true
    end
    --printf("_bp: generic_object_binder: extrapolate_callback: cur_pt = %d: false", cur_pt)
    return false
end

function generic_object_binder:waypoint_callback(obj, action_type, index)
    if self.st.active_section ~= nil then
        xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "waypoint_callback", obj, action_type, index)
    end
end

function generic_object_binder:death_callback(victim, who)
    if who:id() == db.actor:id() then
        xr_statistic.addKillCount(self.object)
    end

    if self.st.mob_death then
        xr_logic.issue_event(self.object, self.st.mob_death, "death_callback", victim, who)
    end
    
    victim:set_nonscript_usable(false)

    if self.st.active_section then
        xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "death_callback", victim, who)
    end

    smart_terrain.on_death( self.object:id() )

    --' Наносим небольшой импульс вперед.
    local h = hit()
    h.draftsman = self.object
    h.type = hit.fire_wound
    h.direction = db.actor:position():sub(self.object:position())
    h:bone("pelvis")
    h.power = 1
    h.impulse = 10
    self.object:hit(h)

    if table.getn(self.particles)>0 then
        for kk,vv in pairs(self.particles) do
                vv:on_death()
        end
    end

    self.MutantManager:on_death(self.object)

    smart_monster_parts.death_spawn(victim)
end

function generic_object_binder:hit_callback(obj, amount, local_direction, who, bone_index)
--    printf("HIT_CALLBACK: [%s] amount[%s]", obj:name(), amount)
    if self.st.hit then
        xr_logic.issue_event(self.object, self.st.hit, "hit_callback", obj, amount, local_direction, who, bone_index)
    end
  amk.on_monster_hit(obj, amount, local_direction, who, bone_index)
    
    -- Щит бюрера из Зова Припяти (Автор: demover123)
    if self.object:clsid()==clsid.burer_s then
        if not self.time_hit then
            self.time_hit = time_global() + 4000
        end
        
        self.object:play_cycle("stand_tele_1", false)
        local particle_start = particles_object("anomaly2\\burer_shield_01")
        particle_start:play_at_pos(self.object:bone_position("bip01_head"))
        self.object.health = self.object.health + 0.1
        
        if self.time_hit <= time_global() then
            if self.object:animation_count() > 0 then
                self.object:clear_animations()
                particle_start:stop()
            end
        end
    end
end

function generic_object_binder:net_spawn(sobject)

    if string.find(self.object:name(), "crow_") then
        local sobj = alife():object(self.object:id())
        if sobj then
            alife():release(sobj, true)
            return false
        end
    end

    if not object_binder.net_spawn(self, sobject) then
        return false
    end

    news_main_spawn.on_spawn(self.object)
    db.add_obj(self.object)

    xr_gulag.setup_gulag_and_logic_on_spawn( self.object, self.st, sobject, modules.stype_mobile, self.loaded )

    local particle_param = utils.cfg_get_string(system_ini(), self.object:section(), "bones_particles", null, false, false, nil)
    
    if particle_param and system_ini():section_exist(particle_param) then
        local tmp=amk.parse_ini_section_to_array(system_ini(),particle_param)
        
        for k,v in pairs(tmp) do
            local t = amk.parse_ini_section_to_array(system_ini(), v)
            t.obj = self.object
            if not t.stop_on_death or self.object:alive() then
                play_particle(self.object, t)
            end
        end
    end

    return true
end

function generic_object_binder:net_destroy()

    if table.getn(self.particles)>0 then
        for kk,vv in pairs(self.particles) do
            if not vv:is_finished() then
                vv:stop()
                self.particles[kk]=nil
            end
        end
    end

    self.object:set_callback(callback.death,                nil)
    self.object:set_callback(callback.patrol_path_in_point, nil)
    self.object:set_callback(callback.hit,                    nil)

    local st = db.storage[self.object:id()]
    if st and st.active_scheme then
        xr_logic.issue_event(self.object, st[st.active_scheme], "net_destroy")
    end
    
    db.del_obj(self.object)
    db.storage[self.object:id()] = nil

    object_binder.net_destroy(self)
end 

function generic_object_binder:reload(section)
    object_binder.reload(self, section)
    --printf("generic_object_binder:reload(): self.object:name()='%s'", self.object:name())
end

function generic_object_binder:net_save_relevant()
    --printf("generic_object_binder:net_save_relevant(): self.object:name()='%s'", self.object:name())
    return true
end

function generic_object_binder:save(packet)

    if string.find(self.object:name(), "crow_") then
        return false
    end

    printf("generic_object_binder:save(): self.object:name()='%s'", self.object:name())
    object_binder.save(self, packet)

    xr_logic.save_obj(self.object, packet)
    if self.object:clsid() == clsid.script_trader then
        trade_manager.save(self.object, packet)
    end
end

function generic_object_binder:load(reader)

    if string.find(self.object:name(), "crow_") then
        return false
    end

    self.loaded = true

    printf("generic_object_binder:load(): self.object:name()='%s'", self.object:name())
    object_binder.load(self, reader)

    if reader:r_eof() then
        abort("SAVE FILE IS CORRUPT")
    end

    xr_logic.load_obj(self.object, reader)
    if self.object:clsid() == clsid.script_trader then
        trade_manager.load(self.object, reader)
    end
end

function play_particle(obj,params)
    if not particles[obj:id()] then
        particles[obj:id()]={}
    end
    table.insert(particles[obj:id()],params)
end

 

 

Ссылка на комментарий

Вот код из архива мода с ошибкой сверху ошибся.

 

 

 

-----------------------------------------------------------------------------------
-- Monster binding
-----------------------------------------------------------------------------------

Скрытый текст

 

local table_enemy_cont = {}
local rand = math.random(1,100)
local BurerNum
local BurerTimer = 0
local song_start_sucks = xr_sound.get_safe_sound_object("monsters\\bloodsucker\\vampire_sucking")

function bind(obj)
    printf("_bp: monster.bind: name='%s', id='%d'", obj:name(), obj:id())

    -- Для спауна
    --xr_spawner.spawn_client(obj)

    local new_binder = generic_object_binder(obj)
    obj:bind_object(new_binder)
end

------------------------------------------------------------------------------------
class "generic_object_binder" (object_binder)

function generic_object_binder:__init(obj) super(obj)
    self.loaded = false
    self.start_anim_hit_cont = false
    self.start_anim_hit_blood = false
    self.start_hit = false
end 

function generic_object_binder:reload(section)
    object_binder.reload(self, section)
end

function generic_object_binder:reinit()
    object_binder.reinit(self)

    -- У торговца нет поддержки перемещения
    if self.object:clsid() ~= clsid.script_trader then
        self.object:set_patrol_extrapolate_callback(generic_object_binder.extrapolate_callback, self)
    end

    db.storage[self.object:id()] = { }

    self.st = db.storage[self.object:id()]

    self.object:set_callback(callback.patrol_path_in_point, self.waypoint_callback, self)
    self.object:set_callback(callback.hit,                    self.hit_callback,        self)
    self.object:set_callback(callback.death,                self.death_callback,    self)
end

function generic_object_binder:update(delta)
    object_binder.update(self, delta)

--    printf("_bp: generic_object_binder: UPDATE [name='%s' time=%d]",
--        self.object:name(), time_global())

    -- Апдейт торговли
    if self.object:clsid() == clsid.script_trader then
        trade_manager.update(self.object)
    end

    if self.object:alive() then
        if self.object:is_talk_enabled() then
            self.object:set_tip_text("character_use")
        else
            self.object:set_tip_text("")
        end
        
        -- Удар контролёра руками из Зова Припяти (Автор: demover123)
        if self.object:clsid() == clsid.controller_s then
            local target = self.object:get_enemy()
            if target and self.object:see(target) and IsStalker(target) then
                local dist = self.object:position():distance_to(target:position())
                if dist <= 1.7 then
                    if not self.get_hit then
                        self.get_hit = time_global() + 100
                        self.start_anim_hit_cont = true
                    elseif self.get_hit <= time_global() then
                        if self.start_anim_hit_cont then
                            if self.object:animation_count() > 0 then
                                self.object:clear_animations()
                            end
                            self.object:play_cycle("stand_attack_1", true)
                            
                            local song_start = xr_sound.get_safe_sound_object("monsters\\controller\\controller_hit_2")
                            song_start:play_at_pos(self.object, self.object:position(), sound_object.s3d)
                            self.start_anim_hit_cont = false
                        end
                        if not self.hit_to_enemy then
                            self.hit_to_enemy = time_global() + 300
                        elseif self.hit_to_enemy <= time_global() then
                            level.add_cam_effector("camera_effects\\hit_back_left.anm", 777, false, "")
                            
                            local h = hit()
                            h.draftsman = self.object
                            h.direction = vector():set(0,0,0)  
                            h:bone("bip01_spine")   
                            h.power     = 0.40     
                            h.impulse   = 1
                            h.type      = hit.wound
                            target:hit(h)
                            
                            self.hit_to_enemy = nil
                            self.get_hit = nil
                        end
                    end
                else
                    self.hit_to_enemy = nil
                    self.get_hit = nil
                end
            end
            if self.object:animation_count() < 1 then
                local i = math.random(0,5)
                self.object:add_animation("stand_walk_fwd_"..i, true)
            end
        end
        
        -- Новое повидение кровососа (Автор: demover123)
        if self.object:clsid() == clsid.bloodsucker_s then
            local target = self.object:get_enemy()
            if target and self.object:see(target) and (IsStalker(target) or IsMonster(target)) then
                local dist = self.object:position():distance_to(target:position())
                if dist < 1.5 then
                    if not self.sucks and not self.steal then
                        rand = math.random(0,100)
                        if rand > 90 then
                            if self.object.health < 1.0 then
                                self.sucks = true
                            end
                        elseif rand < 90 and rand > 70 then
                            local active_slot = db.actor:active_slot()
                            if active_slot==1 or active_slot==2 then
                                self.steal = true
                            end
                        end
                    end
                    
                    if self.steal then
                        if not self.start_steal then
                            self.object:set_invisible(false)
                            self.object:play_cycle("!stand_attack_1", true)
                            local song_steal = xr_sound.get_safe_sound_object("monsters\\bloodsucker\\hit_"..math.random(0,3))
                            if not song_steal:playing() then
                                song_steal:play_at_pos(self.object, self.object:position(), sound_object.s3d)
                            end
                            self.start_steal = time_global() + 400
                        end
                        if self.start_steal <= time_global() then
                            db.actor:drop_item(db.actor:active_item())
                            local h = hit()
                            h.draftsman = self.object
                            h.direction = vector():set(0,0,0)  
                            h:bone("bip01_spine")   
                            h.power     = 0.10     
                            h.impulse   = 1
                            h.type      = hit.wound
                            target:hit(h)
                            self.start_steal = nil
                            self.steal = false
                            self.object:set_invisible(true)
                        end
                    end
                    
                    if self.sucks then
                        if self.object:animation_count() > 0 then
                            self.object:clear_animations()
                        end
                        if not self.bool_vamp_0 then
                            db.actor:hide_weapon()
                            self.object:set_invisible(false)
                            level.disable_input()
                            level.hide_indicators()
                            target:set_actor_direction(-self.object:position():sub(target:position()):getH())
                            self.object:play_cycle("vampire_0", true)
                            self.bool_vamp_0 = true
                        end
                        if not self.first_step then
                            self.first_step = time_global() + 1000
                        elseif self.first_step and self.first_step <= time_global() then
                            if self.object:animation_count() > 0 then
                                self.object:clear_animations()
                            end
                            if not self.bool_vamp_1 then
                                self.object:set_invisible(false)
                                self.object:play_cycle("vampire_1", true)
                                level.add_pp_effector("escape.ppe",778,true)
                                song_start_sucks:play_at_pos(self.object, self.object:position(), sound_object.s3d)
                                self.bool_vamp_1 = true
                            end
                            if not self.bool_next_step then
                                self.second_step = time_global() + 2000
                                self.bool_next_step = true
                            end
                            
                            if self.second_step <= time_global() then
                                self.object:position():sub(target:position()):normalize()
                                
                                if not self.ending_sucks then
                                    self.ending_sucks = time_global() + 700
                                    self.object:set_invisible(false)
                                    local song_start = xr_sound.get_safe_sound_object("monsters\\bloodsucker\\vampire_hit")
                                    song_start:play_at_pos(self.object, self.object:position(), sound_object.s3d)
                                    self.object:play_cycle("vampire_2", true)
                                end
                                
                                if self.ending_sucks <= time_global() then
                                        
                                    level.add_cam_effector("camera_effects\\hit_back_right.anm", 779, false, "")
                                        
                                    local h = hit()
                                    h.draftsman = self.object
                                    h.direction = vector():set(0,0,0)  
                                    h:bone("bip01_spine")   
                                    h.power     = 0.40     
                                    h.impulse   = 1
                                    h.type      = hit.wound
                                    target:hit(h)
                                    
                                    self.object.health = self.object.health + 0.1
                                    
                                    db.actor:restore_weapon()
                                    
                                    level.remove_pp_effector(778)
                                    
                                    self.sucks = false
                                    self.first_step = nil
                                    self.second_step = nil
                                    self.bool_next_step = false
                                    self.bool_vamp_0 = false
                                    self.bool_vamp_1 = false
                                    self.object:set_invisible(true)
                                    rand = math.random(1,100)
                                    
                                    level.enable_input()
                                    level.show_indicators()
                                    
                                    self.ending_sucks = nil
                                end
                            end
                        end
                    end
                else 
                    if self.sucks then
                        db.actor:restore_weapon()
                        level.remove_pp_effector(778)
                        
                        self.object:clear_animations()
                        
                        self.object:set_invisible(true)
                        self.object:set_invisible(false)
                                    
                        if song_start_sucks:playing() then
                            song_start_sucks:stop()
                        end
                                    
                        self.sucks = false
                        self.first_step = nil
                        self.second_step = nil
                        self.bool_next_step = false
                        self.bool_vamp_0 = false
                        self.bool_vamp_1 = false
                        level.enable_input()
                        level.show_indicators()
                    elseif self.steal then
                        self.steal = false
                    end
                end
            end    
            if target and not self.object:see(target) then
                local dist = self.object:position():distance_to(target:position())
                if dist < 20 then
                    if not self.time_to_boogie then
                        self.time_to_boogie = time_global() + (math.random(5,10) * 1000)
                    end
                    if self.time_to_boogie <= time_global() then
                        self.object:set_invisible(false)
                        self.object:play_cycle("stand_threaten_0", true)
                        local song_boogie = xr_sound.get_safe_sound_object("monsters\\bloodsucker\\bloodsucker_script_attack_"..math.random(0,1))
                        if not song_boogie:playing() then
                            song_boogie:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 3.0)
                        end
                        if not self.gotoinvis then
                            self.gotoinvis = true
                        else
                            self.object:set_invisible(true)
                            self.time_to_boogie = nil
                            self.gotoinvis = false
                        end
                    end
                end
            end
        end
        
        -- Атака бюрера из Зова Припяти (Авторы: Shadows and Charsi and demover123)
        if self.object:clsid()==clsid.burer_s and BurerTimer < time_global() then
            local target = self.object:get_enemy()
            local v1 = self.object:direction()
            local v2 = db.actor:direction()
            if target and (target:id()==0) and (v1.x*v2.x)+(v1.z*v2.z)<-0.6 and self.object:see(db.actor) and self.object:position():distance_to(db.actor:position())<6 then
                BurerNum = 1
                db.actor.power = -1.0
                local active_slot = db.actor:active_slot()
                if active_slot==1 or active_slot==2 then
                    db.actor:drop_item(db.actor:active_item())
                    self.object:play_cycle("stand_attack_0", false)
                end
                BurerTimer = time_global() + 6000*(1+math.random(-0.2,0.2))
                self.object:add_animation("stand_idle_"..math.random(0,2), true)
            elseif BurerNum and BurerTimer < time_global() + 6000 then
                self.object:add_animation("stand_idle_"..math.random(0,2), true)
                BurerNum = nil
            end
        end
        
        -- Химера ищет жертву стоя на задних лапах идея была взята из одного квеста в Зове Припяти (Автор: demover123)
        if self.object:clsid()==clsid.chimera_s then
            local target = self.object:get_enemy()
            if target and not self.object:see(target) and IsStalker(target) then
                local dist = self.object:position():distance_to(target:position())
                if dist < 10 then
                    if not self.find then
                        if self.object:animation_count() > 0 then
                            self.object:clear_animations()
                        end
                        self.object:play_cycle("look_around_0", false)
                        if not self.time_to_next_find then
                            self.time_to_next_find = time_global() + 4000
                        end
                        self.find = true
                    else
                        if self.time_to_next_find <= time_global() then
                            self.find = false
                            self.time_to_next_find = nil
                        end
                    end
                end
            end
        end
        
    else
        self.object:set_tip_text_default()
    end

    if self.st.active_section ~= nil then
        xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "update", delta)
    end
end

function generic_object_binder:extrapolate_callback()
    local cur_pt = self.object:get_current_point_index()

    if self.object:get_script ()    == false then 
       return false
    end    
    
    if patrol(self.object:patrol()):flags(cur_pt):get() == 0 then
        --printf("_bp: generic_object_binder: extrapolate_callback: cur_pt = %d: true", cur_pt)
        return true
    end
    --printf("_bp: generic_object_binder: extrapolate_callback: cur_pt = %d: false", cur_pt)
    return false
end

function generic_object_binder:waypoint_callback(obj, action_type, index)
    if self.st.active_section ~= nil then
        xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "waypoint_callback", obj, action_type, index)
    end
end

function generic_object_binder:death_callback(victim, who)
    if who:id() == db.actor:id() then
        xr_statistic.addKillCount(self.object)
    end

    if self.st.mob_death then
        xr_logic.issue_event(self.object, self.st.mob_death, "death_callback", victim, who)
    end
    
    victim:set_nonscript_usable(false)

    if self.st.active_section then
        xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "death_callback", victim, who)
    end

    smart_terrain.on_death( self.object:id() )

    --' Наносим небольшой импульс вперед.
    local h = hit()
    h.draftsman = self.object
    h.type = hit.fire_wound
    h.direction = db.actor:position():sub(self.object:position())
    h:bone("pelvis")
    h.power = 1
    h.impulse = 10
    self.object:hit(h)

end

function generic_object_binder:hit_callback(obj, amount, local_direction, who, bone_index)
--    printf("HIT_CALLBACK: [%s] amount[%s]", obj:name(), amount)
    if self.st.hit then
        xr_logic.issue_event(self.object, self.st.hit, "hit_callback", obj, amount, local_direction, who, bone_index)
    end
    
    -- Щит бюрера из Зова Припяти (Автор: demover123)
    if self.object:clsid()==clsid.burer_s then
        if not self.time_hit then
            self.time_hit = time_global() + 4000
        end
        
        self.object:play_cycle("stand_tele_1", false)
        local particle_start = particles_object("anomaly2\\burer_shield_01")
        particle_start:play_at_pos(self.object:bone_position("bip01_head"))
        self.object.health = self.object.health + 0.1
        
        if self.time_hit <= time_global() then
            if self.object:animation_count() > 0 then
                self.object:clear_animations()
                particle_start:stop()
            end
        end
    end
end

function generic_object_binder:net_spawn(sobject)
    if not object_binder.net_spawn(self, sobject) then
        return false
    end

    db.add_obj(self.object)

    xr_gulag.setup_gulag_and_logic_on_spawn( self.object, self.st, sobject, modules.stype_mobile, self.loaded )

    return true
end

function generic_object_binder:net_destroy()
    self.object:set_callback(callback.death,                nil)
    self.object:set_callback(callback.patrol_path_in_point, nil)
    self.object:set_callback(callback.hit,                    nil)

    local st = db.storage[self.object:id()]
    if st and st.active_scheme then
        xr_logic.issue_event(self.object, st[st.active_scheme], "net_destroy")
    end
    
    db.del_obj(self.object)
    db.storage[self.object:id()] = nil

    object_binder.net_destroy(self)
end 

function generic_object_binder:reload(section)
    object_binder.reload(self, section)
    --printf("generic_object_binder:reload(): self.object:name()='%s'", self.object:name())
end

function generic_object_binder:net_save_relevant()
    --printf("generic_object_binder:net_save_relevant(): self.object:name()='%s'", self.object:name())
    return true
end

function generic_object_binder:save(packet)
    printf("generic_object_binder:save(): self.object:name()='%s'", self.object:name())
    object_binder.save(self, packet)

    xr_logic.save_obj(self.object, packet)
    if self.object:clsid() == clsid.script_trader then
        trade_manager.save(self.object, packet)
    end
end

function generic_object_binder:load(reader)
    self.loaded = true

    printf("generic_object_binder:load(): self.object:name()='%s'", self.object:name())
    object_binder.load(self, reader)

    if reader:r_eof() then
        abort("SAVE FILE IS CORRUPT")
    end

    xr_logic.load_obj(self.object, reader)
    if self.object:clsid() == clsid.script_trader then
        trade_manager.load(self.object, reader)
    end
end

 

 

Добавлено BFG,

Злостное предупреждение.

Посты поправил. Ещё один такой пост с портянкой на тыщщу строк без спойлера и тебе бан.

Ссылка на комментарий

@Dead_Land, не прятать такие портянки под спойлер в зоне опасно, в месных лесах водятся злые контролёры, админы и модераторы готовые по обедать незадачливым сталкером в любой момент. И научись редактировать посты, даблпостинг здесь то же не приветствуется:nea:

Изменено пользователем UriZzz

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

Ссылка на комментарий

@UriZzz, Ты очень даже прав. Всякие злые монстры на АМК иной раз встречаются. Посты поправил. Пред вынес.

 

  • Нравится 2
  • Согласен 2

"Кругом зомби.....у меня кончаются патроны...."

Ссылка на комментарий

@BFG, нуууу не злые но строгие:t1807:, не говорю что это плохо, скорее наоборот...:biggrin::heat:

Изменено пользователем UriZzz

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

Ссылка на комментарий
2 часа назад, Dead_Land сказал:

Вот код из архива мода с ошибкой сверху ошибся.

 

 

 

-----------------------------------------------------------------------------------
-- Monster binding
-----------------------------------------------------------------------------------

  Показать

 

local table_enemy_cont = {}
local rand = math.random(1,100)
local BurerNum
local BurerTimer = 0
local song_start_sucks = xr_sound.get_safe_sound_object("monsters\\bloodsucker\\vampire_sucking")

function bind(obj)
    printf("_bp: monster.bind: name='%s', id='%d'", obj:name(), obj:id())

    -- Для спауна
    --xr_spawner.spawn_client(obj)

    local new_binder = generic_object_binder(obj)
    obj:bind_object(new_binder)
end

------------------------------------------------------------------------------------
class "generic_object_binder" (object_binder)

function generic_object_binder:__init(obj) super(obj)
    self.loaded = false
    self.start_anim_hit_cont = false
    self.start_anim_hit_blood = false
    self.start_hit = false
end 

function generic_object_binder:reload(section)
    object_binder.reload(self, section)
end

function generic_object_binder:reinit()
    object_binder.reinit(self)

    -- У торговца нет поддержки перемещения
    if self.object:clsid() ~= clsid.script_trader then
        self.object:set_patrol_extrapolate_callback(generic_object_binder.extrapolate_callback, self)
    end

    db.storage[self.object:id()] = { }

    self.st = db.storage[self.object:id()]

    self.object:set_callback(callback.patrol_path_in_point, self.waypoint_callback, self)
    self.object:set_callback(callback.hit,                    self.hit_callback,        self)
    self.object:set_callback(callback.death,                self.death_callback,    self)
end

function generic_object_binder:update(delta)
    object_binder.update(self, delta)

--    printf("_bp: generic_object_binder: UPDATE [name='%s' time=%d]",
--        self.object:name(), time_global())

    -- Апдейт торговли
    if self.object:clsid() == clsid.script_trader then
        trade_manager.update(self.object)
    end

    if self.object:alive() then
        if self.object:is_talk_enabled() then
            self.object:set_tip_text("character_use")
        else
            self.object:set_tip_text("")
        end
        
        -- Удар контролёра руками из Зова Припяти (Автор: demover123)
        if self.object:clsid() == clsid.controller_s then
            local target = self.object:get_enemy()
            if target and self.object:see(target) and IsStalker(target) then
                local dist = self.object:position():distance_to(target:position())
                if dist <= 1.7 then
                    if not self.get_hit then
                        self.get_hit = time_global() + 100
                        self.start_anim_hit_cont = true
                    elseif self.get_hit <= time_global() then
                        if self.start_anim_hit_cont then
                            if self.object:animation_count() > 0 then
                                self.object:clear_animations()
                            end
                            self.object:play_cycle("stand_attack_1", true)
                            
                            local song_start = xr_sound.get_safe_sound_object("monsters\\controller\\controller_hit_2")
                            song_start:play_at_pos(self.object, self.object:position(), sound_object.s3d)
                            self.start_anim_hit_cont = false
                        end
                        if not self.hit_to_enemy then
                            self.hit_to_enemy = time_global() + 300
                        elseif self.hit_to_enemy <= time_global() then
                            level.add_cam_effector("camera_effects\\hit_back_left.anm", 777, false, "")
                            
                            local h = hit()
                            h.draftsman = self.object
                            h.direction = vector():set(0,0,0)  
                            h:bone("bip01_spine")   
                            h.power     = 0.40     
                            h.impulse   = 1
                            h.type      = hit.wound
                            target:hit(h)
                            
                            self.hit_to_enemy = nil
                            self.get_hit = nil
                        end
                    end
                else
                    self.hit_to_enemy = nil
                    self.get_hit = nil
                end
            end
            if self.object:animation_count() < 1 then
                local i = math.random(0,5)
                self.object:add_animation("stand_walk_fwd_"..i, true)
            end
        end
        
        -- Новое повидение кровососа (Автор: demover123)
        if self.object:clsid() == clsid.bloodsucker_s then
            local target = self.object:get_enemy()
            if target and self.object:see(target) and (IsStalker(target) or IsMonster(target)) then
                local dist = self.object:position():distance_to(target:position())
                if dist < 1.5 then
                    if not self.sucks and not self.steal then
                        rand = math.random(0,100)
                        if rand > 90 then
                            if self.object.health < 1.0 then
                                self.sucks = true
                            end
                        elseif rand < 90 and rand > 70 then
                            local active_slot = db.actor:active_slot()
                            if active_slot==1 or active_slot==2 then
                                self.steal = true
                            end
                        end
                    end
                    
                    if self.steal then
                        if not self.start_steal then
                            self.object:set_invisible(false)
                            self.object:play_cycle("!stand_attack_1", true)
                            local song_steal = xr_sound.get_safe_sound_object("monsters\\bloodsucker\\hit_"..math.random(0,3))
                            if not song_steal:playing() then
                                song_steal:play_at_pos(self.object, self.object:position(), sound_object.s3d)
                            end
                            self.start_steal = time_global() + 400
                        end
                        if self.start_steal <= time_global() then
                            db.actor:drop_item(db.actor:active_item())
                            local h = hit()
                            h.draftsman = self.object
                            h.direction = vector():set(0,0,0)  
                            h:bone("bip01_spine")   
                            h.power     = 0.10     
                            h.impulse   = 1
                            h.type      = hit.wound
                            target:hit(h)
                            self.start_steal = nil
                            self.steal = false
                            self.object:set_invisible(true)
                        end
                    end
                    
                    if self.sucks then
                        if self.object:animation_count() > 0 then
                            self.object:clear_animations()
                        end
                        if not self.bool_vamp_0 then
                            db.actor:hide_weapon()
                            self.object:set_invisible(false)
                            level.disable_input()
                            level.hide_indicators()
                            target:set_actor_direction(-self.object:position():sub(target:position()):getH())
                            self.object:play_cycle("vampire_0", true)
                            self.bool_vamp_0 = true
                        end
                        if not self.first_step then
                            self.first_step = time_global() + 1000
                        elseif self.first_step and self.first_step <= time_global() then
                            if self.object:animation_count() > 0 then
                                self.object:clear_animations()
                            end
                            if not self.bool_vamp_1 then
                                self.object:set_invisible(false)
                                self.object:play_cycle("vampire_1", true)
                                level.add_pp_effector("escape.ppe",778,true)
                                song_start_sucks:play_at_pos(self.object, self.object:position(), sound_object.s3d)
                                self.bool_vamp_1 = true
                            end
                            if not self.bool_next_step then
                                self.second_step = time_global() + 2000
                                self.bool_next_step = true
                            end
                            
                            if self.second_step <= time_global() then
                                self.object:position():sub(target:position()):normalize()
                                
                                if not self.ending_sucks then
                                    self.ending_sucks = time_global() + 700
                                    self.object:set_invisible(false)
                                    local song_start = xr_sound.get_safe_sound_object("monsters\\bloodsucker\\vampire_hit")
                                    song_start:play_at_pos(self.object, self.object:position(), sound_object.s3d)
                                    self.object:play_cycle("vampire_2", true)
                                end
                                
                                if self.ending_sucks <= time_global() then
                                        
                                    level.add_cam_effector("camera_effects\\hit_back_right.anm", 779, false, "")
                                        
                                    local h = hit()
                                    h.draftsman = self.object
                                    h.direction = vector():set(0,0,0)  
                                    h:bone("bip01_spine")   
                                    h.power     = 0.40     
                                    h.impulse   = 1
                                    h.type      = hit.wound
                                    target:hit(h)
                                    
                                    self.object.health = self.object.health + 0.1
                                    
                                    db.actor:restore_weapon()
                                    
                                    level.remove_pp_effector(778)
                                    
                                    self.sucks = false
                                    self.first_step = nil
                                    self.second_step = nil
                                    self.bool_next_step = false
                                    self.bool_vamp_0 = false
                                    self.bool_vamp_1 = false
                                    self.object:set_invisible(true)
                                    rand = math.random(1,100)
                                    
                                    level.enable_input()
                                    level.show_indicators()
                                    
                                    self.ending_sucks = nil
                                end
                            end
                        end
                    end
                else 
                    if self.sucks then
                        db.actor:restore_weapon()
                        level.remove_pp_effector(778)
                        
                        self.object:clear_animations()
                        
                        self.object:set_invisible(true)
                        self.object:set_invisible(false)
                                    
                        if song_start_sucks:playing() then
                            song_start_sucks:stop()
                        end
                                    
                        self.sucks = false
                        self.first_step = nil
                        self.second_step = nil
                        self.bool_next_step = false
                        self.bool_vamp_0 = false
                        self.bool_vamp_1 = false
                        level.enable_input()
                        level.show_indicators()
                    elseif self.steal then
                        self.steal = false
                    end
                end
            end    
            if target and not self.object:see(target) then
                local dist = self.object:position():distance_to(target:position())
                if dist < 20 then
                    if not self.time_to_boogie then
                        self.time_to_boogie = time_global() + (math.random(5,10) * 1000)
                    end
                    if self.time_to_boogie <= time_global() then
                        self.object:set_invisible(false)
                        self.object:play_cycle("stand_threaten_0", true)
                        local song_boogie = xr_sound.get_safe_sound_object("monsters\\bloodsucker\\bloodsucker_script_attack_"..math.random(0,1))
                        if not song_boogie:playing() then
                            song_boogie:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 3.0)
                        end
                        if not self.gotoinvis then
                            self.gotoinvis = true
                        else
                            self.object:set_invisible(true)
                            self.time_to_boogie = nil
                            self.gotoinvis = false
                        end
                    end
                end
            end
        end
        
        -- Атака бюрера из Зова Припяти (Авторы: Shadows and Charsi and demover123)
        if self.object:clsid()==clsid.burer_s and BurerTimer < time_global() then
            local target = self.object:get_enemy()
            local v1 = self.object:direction()
            local v2 = db.actor:direction()
            if target and (target:id()==0) and (v1.x*v2.x)+(v1.z*v2.z)<-0.6 and self.object:see(db.actor) and self.object:position():distance_to(db.actor:position())<6 then
                BurerNum = 1
                db.actor.power = -1.0
                local active_slot = db.actor:active_slot()
                if active_slot==1 or active_slot==2 then
                    db.actor:drop_item(db.actor:active_item())
                    self.object:play_cycle("stand_attack_0", false)
                end
                BurerTimer = time_global() + 6000*(1+math.random(-0.2,0.2))
                self.object:add_animation("stand_idle_"..math.random(0,2), true)
            elseif BurerNum and BurerTimer < time_global() + 6000 then
                self.object:add_animation("stand_idle_"..math.random(0,2), true)
                BurerNum = nil
            end
        end
        
        -- Химера ищет жертву стоя на задних лапах идея была взята из одного квеста в Зове Припяти (Автор: demover123)
        if self.object:clsid()==clsid.chimera_s then
            local target = self.object:get_enemy()
            if target and not self.object:see(target) and IsStalker(target) then
                local dist = self.object:position():distance_to(target:position())
                if dist < 10 then
                    if not self.find then
                        if self.object:animation_count() > 0 then
                            self.object:clear_animations()
                        end
                        self.object:play_cycle("look_around_0", false)
                        if not self.time_to_next_find then
                            self.time_to_next_find = time_global() + 4000
                        end
                        self.find = true
                    else
                        if self.time_to_next_find <= time_global() then
                            self.find = false
                            self.time_to_next_find = nil
                        end
                    end
                end
            end
        end
        
    else
        self.object:set_tip_text_default()
    end

    if self.st.active_section ~= nil then
        xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "update", delta)
    end
end

function generic_object_binder:extrapolate_callback()
    local cur_pt = self.object:get_current_point_index()

    if self.object:get_script ()    == false then 
       return false
    end    
    
    if patrol(self.object:patrol()):flags(cur_pt):get() == 0 then
        --printf("_bp: generic_object_binder: extrapolate_callback: cur_pt = %d: true", cur_pt)
        return true
    end
    --printf("_bp: generic_object_binder: extrapolate_callback: cur_pt = %d: false", cur_pt)
    return false
end

function generic_object_binder:waypoint_callback(obj, action_type, index)
    if self.st.active_section ~= nil then
        xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "waypoint_callback", obj, action_type, index)
    end
end

function generic_object_binder:death_callback(victim, who)
    if who:id() == db.actor:id() then
        xr_statistic.addKillCount(self.object)
    end

    if self.st.mob_death then
        xr_logic.issue_event(self.object, self.st.mob_death, "death_callback", victim, who)
    end
    
    victim:set_nonscript_usable(false)

    if self.st.active_section then
        xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "death_callback", victim, who)
    end

    smart_terrain.on_death( self.object:id() )

    --' Наносим небольшой импульс вперед.
    local h = hit()
    h.draftsman = self.object
    h.type = hit.fire_wound
    h.direction = db.actor:position():sub(self.object:position())
    h:bone("pelvis")
    h.power = 1
    h.impulse = 10
    self.object:hit(h)

end

function generic_object_binder:hit_callback(obj, amount, local_direction, who, bone_index)
--    printf("HIT_CALLBACK: [%s] amount[%s]", obj:name(), amount)
    if self.st.hit then
        xr_logic.issue_event(self.object, self.st.hit, "hit_callback", obj, amount, local_direction, who, bone_index)
    end
    
    -- Щит бюрера из Зова Припяти (Автор: demover123)
    if self.object:clsid()==clsid.burer_s then
        if not self.time_hit then
            self.time_hit = time_global() + 4000
        end
        
        self.object:play_cycle("stand_tele_1", false)
        local particle_start = particles_object("anomaly2\\burer_shield_01")
        particle_start:play_at_pos(self.object:bone_position("bip01_head"))
        self.object.health = self.object.health + 0.1
        
        if self.time_hit <= time_global() then
            if self.object:animation_count() > 0 then
                self.object:clear_animations()
                particle_start:stop()
            end
        end
    end
end

function generic_object_binder:net_spawn(sobject)
    if not object_binder.net_spawn(self, sobject) then
        return false
    end

    db.add_obj(self.object)

    xr_gulag.setup_gulag_and_logic_on_spawn( self.object, self.st, sobject, modules.stype_mobile, self.loaded )

    return true
end

function generic_object_binder:net_destroy()
    self.object:set_callback(callback.death,                nil)
    self.object:set_callback(callback.patrol_path_in_point, nil)
    self.object:set_callback(callback.hit,                    nil)

    local st = db.storage[self.object:id()]
    if st and st.active_scheme then
        xr_logic.issue_event(self.object, st[st.active_scheme], "net_destroy")
    end
    
    db.del_obj(self.object)
    db.storage[self.object:id()] = nil

    object_binder.net_destroy(self)
end 

function generic_object_binder:reload(section)
    object_binder.reload(self, section)
    --printf("generic_object_binder:reload(): self.object:name()='%s'", self.object:name())
end

function generic_object_binder:net_save_relevant()
    --printf("generic_object_binder:net_save_relevant(): self.object:name()='%s'", self.object:name())
    return true
end

function generic_object_binder:save(packet)
    printf("generic_object_binder:save(): self.object:name()='%s'", self.object:name())
    object_binder.save(self, packet)

    xr_logic.save_obj(self.object, packet)
    if self.object:clsid() == clsid.script_trader then
        trade_manager.save(self.object, packet)
    end
end

function generic_object_binder:load(reader)
    self.loaded = true

    printf("generic_object_binder:load(): self.object:name()='%s'", self.object:name())
    object_binder.load(self, reader)

    if reader:r_eof() then
        abort("SAVE FILE IS CORRUPT")
    end

    xr_logic.load_obj(self.object, reader)
    if self.object:clsid() == clsid.script_trader then
        trade_manager.load(self.object, reader)
    end
end

 

 

Есть кто шарит в этом?

Ссылка на комментарий

@Змея

Скрытый текст

- Видно, встал не с той ноги?

- Не болтай, а помоги!(с) :biggrin:

Хотя, да, модная нынче манера - "...дайте мне таблеток от жадности, побольше и желательно сразу...", несколько... м-мм... раздражает.

@Dead_Land, "сварщик не настоящий"(с), но, как вариант, почитать здесь о методе  set_nonscript_usable(bool) и где-то здесь

Скрытый текст

function generic_object_binder:death_callback(victim, who)
...  
--   victim:set_nonscript_usable(false)
...
end

 

применить на практике.

p.s.: бли-и-ин, граммар-наци бесится: всё-таки "повИдение" через "е".

  • Нравится 1
Ссылка на комментарий
4 часа назад, Купер сказал:

@Змея

  Показать

- Видно, встал не с той ноги?

- Не болтай, а помоги!(с) :biggrin:

Хотя, да, модная нынче манера - "...дайте мне таблеток от жадности, побольше и желательно сразу...", несколько... м-мм... раздражает.

@Dead_Land, "сварщик не настоящий"(с), но, как вариант, почитать здесь о методе  set_nonscript_usable(bool) и где-то здесь

  Скрыть


function generic_object_binder:death_callback(victim, who)
...  
--   victim:set_nonscript_usable(false)
...
end

 

применить на практике.

p.s.: бли-и-ин, граммар-наци бесится: всё-таки "повИдение" через "е".

--   victim:set_nonscript_usable(false)
Вот я на него и думал щас попробую чёнить забабахать спасибо)
Ссылка на комментарий
4 часа назад, Купер сказал:

@Змея

  Показать

- Видно, встал не с той ноги?

- Не болтай, а помоги!(с) :biggrin:

Хотя, да, модная нынче манера - "...дайте мне таблеток от жадности, побольше и желательно сразу...", несколько... м-мм... раздражает.

@Dead_Land, "сварщик не настоящий"(с), но, как вариант, почитать здесь о методе  set_nonscript_usable(bool) и где-то здесь

  Скрыть


function generic_object_binder:death_callback(victim, who)
...  
--   victim:set_nonscript_usable(false)
...
end

 

применить на практике.

p.s.: бли-и-ин, граммар-наци бесится: всё-таки "повИдение" через "е".

Вообщем-то я просто вырезал эту строчку зачем автор мода её туда вставил остается загадкой так как она вообще роли особой не играет но спасибо иду дальше мод пилить.

P.S Ребят с АМК  как вы в логике задали военным на насыпи координаты передвижения ?

Ссылка на комментарий

Если кто в курсе, подскажите, пожалуйста, по actor_stats ( конкретно интересует "stalkerkills" ) -- оно используется в ТЧ при каких-то движковых обсчётах или это просто "цыфирьки в пда для красоты"? В скриптах везде проверки идут вроде как по character_reputation(), добавил для теста 1000 очков в  actor_stats "stalkerkills" -- character_reputation() не изменилась, хотя в пда "ранг" вырос до мастера.

 

Хочется попробовать в "stalkerkills" писать вместо убитых Васей и Петей другую всякую-разную занимательную статистику, там в принципе везде можно задать xr_statistic.add_pts( "stalkerkills", my_stat, 1, 0 ) и добавится 0, кроме счётчика смертей ГГ - там нужно по-любому 1 очко добавлять, иначе не будет правильно обновляться в ПДА при загрузке сейва число смертей (использую наработку из аддона naxac и последующую синхронизацию с числом в ПДА при загрузке сохранения).

 

По рангу единственное что нашёл, это в _g.script:

function set_actor_rank(rank)
  if rank=="novice" then
    db.actor:set_character_rank(0)
  elseif rank=="stalker" then
    db.actor:set_character_rank(300)
  elseif rank=="veteran" then
    db.actor:set_character_rank(600)
  elseif rank=="master" then
    db.actor:set_character_rank(900)
  end
end

но в этот character_rank по идее можно и не добавлять ничего, изменив в xr_statistic условие

  if pts >= 1 then
     db.actor:set_character_rank( db.actor:character_rank() + pts )
  end

на

  if pts >= 1 and sect_name ~= my_sect then
     db.actor:set_character_rank( db.actor:character_rank() + pts )
  end

( хотя конечно помереть 1000 раз и за это заработать ранг "мастер" - это в принципе даже справедливо. Там же не указано, мастер ЧЕГО :lol3:)

Ссылка на комментарий

А кто знает, функция set_gravity в ТЧ работает, или в луа_хелп только ее описалово? В чистой игре и некоторых модах искал - не нашел конкретного примера...

Сталкер - наше всё!

Ссылка на комментарий
1 час назад, AndrewMor сказал:

А кто знает, функция set_gravity в ТЧ работает, или в луа_хелп только ее описалово?

Только в xray extensions можно включить консольную ph_gravity. Или экспериментировать с аномалией типа "лифта". Я так "симулятор полета" делал.:crazy2:

https://www.youtube.com/watch?v=HbZ9m3C2tsg

Ссылка на комментарий

Ребят что это может значить?

 

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...yl way of death\gamedata\scripts\xr_motivator.script:409: attempt to call field 'on_npc_hit' (a nil value) Раньше не было мод кстати Interactive_Music_Mod ругает когда неписи начинают Pvp так сказать)

Ссылка на комментарий

@Dead_Land, мы совершенно не знаем, что ты делал.
Возможно, твой мод на версию 1.0006, в следствии несовместимости вылетает.

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

Ссылка на комментарий
23 часа назад, macron сказал:

Или экспериментировать с аномалией типа "лифта

Я пробовал ее спавнить, но так и не понял, как она работает. То поднимает, то нет. Ощущение, что она недоделанная, одна такая на стадионе в Припяти была.

Сталкер - наше всё!

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   1 пользователь

×
×
  • Создать...