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

Скриптование


Svoboда

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

У меня есть вопрос

Почему только gespwant мой NPC, когда я рядом с его spawnpoints?

это мой сценарий, и у меня есть два сценария из другого упаковщик LW MOD

Я надеюсь, что рукоять далее

local oIni = ini_file("respawn\\respwaner.ltx")
function Init()
    if not has_alife_info("spwan_npc") then
        
    if oIni:section_exist("respawns") then
        for iKey = 0, oIni:line_count("respawns") - 1 do
            local bResult, sRespawn, sValue = oIni:r_line("respawns", iKey, "", "false")
            if bResult and sValue == "true" and oIni:section_exist(sRespawn) then
    
                local tData = {}
    
                tData["RespawnSections"] = ReadLine(oIni, "String", sRespawn, "sections")                
                tData["MaxSpawn"] = ReadLine(oIni, "Number", sRespawn, "max_spawn", 1)
                tData["MaxCount"] = ReadLine(oIni, "Number", sRespawn, "max_count", tData["MaxSpawn"])
                tData["MinCount"] = ReadLine(oIni, "Number", sRespawn, "min_count", tData["MaxCount"])
                tData["Conditions"] = ReadLine(oIni, "String", sRespawn, "conditions", 100)    
                tData["iIdleSpawn"] = ReadLine(oIni, "String", sRespawn, "idle_spawn", "medium")
                tData["sLogic"] = ReadLine(oIni, "String", sRespawn, "logic", "nil")
                tData["sCount"] = ReadLine(oIni, "String", sRespawn, "count", "nil")

                local sPosition = ReadLine(oIni, "String", sRespawn, "position")
                local tPos = SplitString(sPosition, 1, ",")
                
                local sCustomData = "[respawn]\n" ..
                    "name = "..sRespawn.."\n" ..
                    "respawn_section = "..tData["RespawnSections"].."\n" ..
                    "max_spawn = "..tData["MaxSpawn"].."\n" ..
                    "idle_spawn = "..tData["iIdleSpawn"].."\n" ..
                    "conditions    = "..tData["Conditions"].."\n" ..
                    "logic = "..tData["sLogic"].."\n" ..
                    "count = "..tData["sCount"]

                local vPos = vector():set(tonumber(tPos[1]), tonumber(tPos[2]), tonumber(tPos[3]) )
                local oRespawn = alife():create("respawn", vPos, tonumber(tPos[4]), tonumber(tPos[5]) ) 

                tData = net_packet_read.GetRespawn(oRespawn)    
                
                tData.tShape = {}
                tData.tShape[1] = {}
                tData.tShape[1].iShapeType = 0
                tData.tShape[1].iRadius = 1
                tData.tShape[1].vCenter = vector():set(0, 0, 0)
                
                tData.sCustomData = sCustomData        
            
                net_packet_write.SetRespawn(tData, oRespawn)    

                se_respawn.RegisterInit(oRespawn)
                se_respawn.spawnAction(oRespawn:name() )
                end
            end
        end
    end

db.actor:give_info_portion("spwan_npc")
end

 

local tIdlePreset = {
    ["seldom"]    = 900,
    ["medium"]    = 700,
    ["often"]     = 300
}

local i,k,v = 0,0,0

local tRespawners         = {}
local tRespawnersParent = {}


class "se_respawn" (cse_alife_smart_zone)
function se_respawn:__init(section) super(section)
    self.tSpawnObject     = {}    
    self.tSpawnProp     = {}
    self.oRespawnTime = game.CTime()
end


function se_respawn:STATE_Write( packet )
    cse_alife_smart_zone.STATE_Write( self, packet )
    utils.w_CTime(packet, self.oRespawnTime)
    
    local iTableSize = table.getn(self.tSpawnObject)
    packet:w_u8(iTableSize)    
    for i = 1, iTableSize do
        packet:w_u16(self.tSpawnObject[i])
    end
end


function se_respawn:STATE_Read( packet, size )
    cse_alife_smart_zone.STATE_Read( self, packet, size )    
    if editor() then
        return
    end
    
    self.oRespawnTime = utils.r_CTime(packet)
    local iTableSize = packet:r_u8()
    for i = 1, iTableSize do
        table.insert(self.tSpawnObject, packet:r_u16())
    end    
end

function se_respawn:on_register()
    cse_alife_smart_zone.on_register(self)
    RegisterInit(self)
end


function se_respawn:update()
    cse_alife_smart_zone.update(self)
    self:execute()
end


function se_respawn:execute()
    if self.iIdleSpawn == -1 then 
        return 
    end    

    if self.oRespawnTime > game.get_game_time() then
        return
    end
    
    local oIdleTime = game.CTime()
    oIdleTime:setHMSms(0,0,0, self.iIdleSpawn * math.random(1, 2) * 600)
    self.oRespawnTime = game.get_game_time() + oIdleTime        
    self:UpdateObject()

    local sProbability = xr_logic.pick_section_from_condlist(db.actor_proxy, self, self.aConditions)
    if not sProbability or tonumber(sProbability) == 0 then 
        sim_statistic.respawn_enabled(self, false)
        return 
    end
    sim_statistic.respawn_enabled(self, true)

    if table.getn(self.tSpawnObject) < self.iMinCount then        
        while table.getn(self.tSpawnObject) < self.iMinCount do
            if self:CreateObject(100) == false then
                return
            end
        end    
        return
    end
        

    for i = 1, self.iMaxSpawn do        
        if self.iMaxCount ~= -1 and self.iMaxCount < #self.tSpawnObject then 
            return 
        end
        if self.tCount then
            for iKey, tRespawn in pairs(self.tSectionsToRespawn) do
                local iCount = self.tCount[iKey] or 1
                printf("Респавн: "..tostring(self.sName)..": "..tRespawn.section.." - "..iCount)
                
                for i = 1, iCount do
                    self:CreateObject(sProbability, tRespawn.section)
                end
            end    
        else
            if self:CreateObject(sProbability) == false then 
                return 
            end
        end
    end    
end


function se_respawn:UpdateObject()
    for k,v in pairs(self.tSpawnObject) do
        local obj = level.object_by_id(v)    
        if obj == nil then obj = alife():object(v) end    

        if obj == nil or ((IsStalker(obj) or IsMonster(obj)) and (obj:alive()~=true)) then
            table.remove(self.tSpawnObject, k)
        end
    end
end


function se_respawn:CreateObject(sProbability, sSpawnSection)
    if math.random(100) > tonumber(sProbability) then
        return
    end    
        
    local iSum = 0

    if not sSpawnSection then    
        for k,v in pairs(self.tSectionsToRespawn) do
            iSum = iSum + v.probability
        end
        
        iSum = math.random(0, iSum)
        for k,v in pairs(self.tSectionsToRespawn) do
            iSum = iSum - v.probability            
            if iSum <= 0 then
                sSpawnSection = v.section
                break
            end
        end
    end
    
    if sSpawnSection == nil then return false end        
    
    if self.iParent then
        local oParent = alife():story_object(self.iParent)
        if oParent == nil then
            abort("SPAWNING [%s], cant find parent with SID [%s]", self:name(), self.iParent)
            return
        end

        if oParent.id and self.bItemSpawn then
            local oItem = alife():create(sSpawnSection,    
                self.position,
                self.m_level_vertex_id,    
                self.m_game_vertex_id,
                oParent.id)                        
            table.insert(self.tSpawnObject, oItem.id)
            return true
        end
    else
        local oCreature = alife():create(sSpawnSection,    
            self.position,
            self.m_level_vertex_id,    
            self.m_game_vertex_id)    
        
        if self.sName==nil then
            if self.tSpawnProp[sSpawnSection].isCheck == true then
                oCreature:brain():update()
                local iSmartTerrainID = oCreature:smart_terrain_id()            
                if iSmartTerrainID ~= 65535 then        
                    table.insert(self.tSpawnObject, oCreature.id)
                    return true
                else
                    alife():release(oCreature, true)
                    return false
                end
            end                        
            table.insert(self.tSpawnObject, oCreature.id)
            return true
        else    
            if self.sLogic ~= "nil" then
                if IsMonster(oCreature) then
                    local tData = net_packet_read.GetMonster(oCreature)                    
                    tData.sCustomData = "[logic]\ncfg = scripts\\"..self.sLogic..".ltx" 
                    net_packet_write.SetMonster(tData, oCreature)
                elseif IsStalker(oCreature) then    
                    local tData = net_packet_read.GetStalker(oCreature)
                    tData.sCustomData = "[logic]\ncfg = scripts\\"..self.sLogic..".ltx" 
                    net_packet_write.SetStalker(tData, oCreature)
                end
            end
            table.insert(self.tSpawnObject, oCreature.id)
            return true
        end
    end
end


function RegisterInit(oRespawn)
    local ini = oRespawn:spawn_ini()
    if not ini:section_exist("respawn") then return    end

    oRespawn.tSectionsToRespawn  = readSpawns(ini, "respawn", "respawn_section", oRespawn.tSpawnProp)    
    if oRespawn.tSectionsToRespawn == nil then
        abort("RESPAWN: [%s] field 'respawn_section' doesn't exist.", tostring(oRespawn:name()))
    end    

    oRespawn.sLogic = ReadLine(ini, "String", "respawn", "logic")    
    oRespawn.sName = ReadLine(ini, "String", "respawn", "name")
    oRespawn.iMinCount =  ReadLine(ini, "Number", "respawn", "min_count",  0)
    oRespawn.iMaxCount =  ReadLine(ini, "Number", "respawn", "max_count", -1)
    oRespawn.iMaxSpawn =  ReadLine(ini, "Number", "respawn", "max_spawn",  1)
    oRespawn.iIdleSpawn = ReadLine(ini, "String", "respawn", "idle_spawn", "medium")
    oRespawn.sCond = ReadLine(ini, "String", "respawn", "conditions", 100)
    oRespawn.aConditions = xr_logic.parse_condlist(oRespawn, "respawn", "conditions", oRespawn.sCond)
    oRespawn.iParent =  ReadLine(ini, "Number", "respawn", "parent", nil)
    oRespawn.bItemSpawn = ReadLine(ini, "Boolean", "respawn", "item_spawn", false)

    local sCount = ReadLine(ini, "String", "respawn", "count", "nil")
    if sCount ~= "nil" then
        oRespawn.tCount = SplitString(sCount, 1, ",")
    end
    
    if oRespawn.iMinCount > oRespawn.iMaxCount and oRespawn.iMaxCount ~= -1 then
        abort("RESPAWN: [%s] min_count > max_count", oRespawn:name())
    end
    if tIdlePreset[oRespawn.iIdleSpawn] ~= nil then
        oRespawn.iIdleSpawn = tIdlePreset[oRespawn.iIdleSpawn]
    else
        oRespawn.iIdleSpawn = tonumber(oRespawn.iIdleSpawn)
        if oRespawn.iIdleSpawn == nil then
            abort("RESPAWN: [%s] 'idle_spawn' doesn't exist.", oRespawn:name())
        end
    end
    
    tRespawners[oRespawn:name()] = oRespawn
    if oRespawn.iParent ~= nil then
        tRespawnersParent[oRespawn.iParent] = oRespawn
    end

    sim_statistic.register_respawn(oRespawn)
end


function spawnAction(name)
    local myRespawn = tRespawners[name]
    if myRespawn == nil then
        return
    end
        
    local sProbability = xr_logic.pick_section_from_condlist(db.actor_proxy, myRespawn, myRespawn.aConditions)
    for i = 1, myRespawn.iMaxSpawn do        
        if myRespawn.iMaxCount ~= -1 and table.getn(myRespawn.tSpawnObject) >= myRespawn.iMaxCount then
            return
        end
        if myRespawn.tCount then
            for iKey, tRespawn in pairs(myRespawn.tSectionsToRespawn) do
                local iCount = myRespawn.tCount[iKey] or 1
                printf(tostring(myRespawn.sName)..": "..tRespawn.section.." - "..iCount)
                
                for i = 1, iCount do
                    myRespawn:CreateObject(sProbability, tRespawn.section)
                end
            end                
            StartTime(myRespawn)
            
            return
        end
        
        if myRespawn:CreateObject(sProbability) == false then
            return
        else
            StartTime(myRespawn)
        end
    end    
end

function StartTime(myRespawn)
    local oIdleTime = game.CTime()
    oIdleTime:setHMSms(0,0,0, myRespawn.iIdleSpawn * math.random(1, 3) * 600)
    myRespawn.oRespawnTime = game.get_game_time() + oIdleTime
end

function parse_names(s)
    local t = {}
    for sName in string.gfind(s, "([%w_%-.\\]+)%p*") do
        table.insert(t, sName)
    end
    return t
end


function readSpawns(spawn_ini, section, line, tSpawnProp)
    if spawn_ini:line_exist(section, line) then            
        local tRetTable = {}
        local aTableSpawn = parse_names(spawn_ini:r_string(section, line))    
        local iCount = table.getn(aTableSpawn)            
        local k = 1        
        while k <= iCount do            
            local tSpawn = {}
            tSpawn.section = aTableSpawn[k]

            if aTableSpawn[k+1] ~= nil then
                local p = tonumber(aTableSpawn[k+1])
                if p then
                    tSpawn.probability = p
                    k = k + 2
                else
                    tSpawn.probability = 1
                    k = k + 1
                end
            else
                tSpawn.probability = 1
                k = k + 1
            end
            table.insert(tRetTable, tSpawn)    
            if tSpawnProp[tSpawn.section] == nil then        
                local respawn_ini = system_ini()
                local sCommunity     = ReadLine(respawn_ini, "String", tSpawn.section, "community", "nil")
                local sRank         = ReadLine(respawn_ini, "String", tSpawn.section, "spec_rank", "nil")
                local isCheck         = true
                local sCustomData     = ReadLine(respawn_ini, "String", tSpawn.section, "custom_data")        
                if sCustomData ~= nil then
                    local iniCustomData = ini_file(sCustomData)            
                    if iniCustomData:section_exist("smart_terrains") then                    
                        if iniCustomData:line_exist("smart_terrains", "none") then
                            if ReadLine(iniCustomData, "String", "smart_terrains", "none") == "true" then
                                isCheck = false
                            end    
                        end                    
                        if iniCustomData:line_exist("smart_terrains", "respawn_check") then
                            if ReadLine(iniCustomData, "String", "smart_terrains", "respawn_check") == "false" then
                                isCheck = false
                            end
                        end             
                    end
                end                
                tSpawnProp[tSpawn.section] = { sCommunity = sCommunity, sRank = sRank, isCheck = isCheck }
            end                    
        end    
        return tRetTable
    end    
    return nil
end


function create_ammo(section, position, lvi, gvi, pid, num)
    local ini = system_ini()
    local num_in_box = ini:r_u32(section, "box_size")
    while num > num_in_box do
        alife():create_ammo(section, position, lvi,    gvi, pid, num_in_box)
        num = num - num_in_box
    end
    return alife():create_ammo(section, position, lvi,    gvi, pid, num)
end



function spawn(name)
    local spawner = respawners[name]
    if spawner == nil then
        return
    end
    
    for i=1,spawner.max_spawn do
        if spawner.max_count ~= -1 and table.getn(spawner.spawned_obj) >= spawner.max_count then
--            printf("SPAWNING [%s], CANT SPAWN. MAX COUNT REACHED!!!", tostring(spawner:name()))
            return
        end        
        if spawner:create(xr_logic.pick_section_from_condlist(db.actor_proxy, spawner, spawner.conditions)) == false then
            return
        end
    end        
end

 

------------------------------------

А вот это уже зря ...

Получив бан за нарушение правил, olaf1, ты только усугубляешь свое нарушение, дублируя регистрацию себя под другими никами.

Ты так ничего и не понял о необходимости соблюдать правила форума. Более ответов для тебя не будет. --/Artos

 

Добавлено через 17 мин.:

что происходит?

кто olaf1?

 

Я просто скопировал его сценарий и улучшить его.

 

:rofl2:

ColR_iT

 

Если ты не olaf1 (действуешь по сути от его имени), то ... скопировал не только его сценарий, но и все то, за что им получен бан.

Т.е. и бессвязанное и безграмотное описание вопроса и недостаточную информативность в вопросе. --/Artos

 

Добавлено через 16 мин.:

Я не olaf1 и хорошо его знают не только видели его сценарий, и я думал, что я, возможно, выглядели лучше, и даже einwenig GSC форум, но koonnten не поможет мне

 

Я надеюсь, что они понимают, что я не olaf1 и я никогда не буду

 

Если ты не olaf1, то настоятельно рекомендую посмотреть не только его коды, которые он приводил тут на форуме, но и то, что ему рекомендовалось по поводу написания своих вопросов (на двух языках: рус и eng), дабы понять можно было бы. И писать ГРАМОТНО, т.е. понять вопрос:

Почему только gespwant мой NPC, когда я рядом с его spawnpoints?
- врядли кто сможет. Выделенных слов нет ни в русском ни в английском языках и вопрос бессмысленен.

В противном случае, правила форума, о необходимости грамотно писать в своих сообщениях, касаются всех, не взирая на национальные и языковые особенности. --/Artos

 

Добавлено через 14 мин.:

эх жаль

К сожалению, для моего языка, но я немецкий

и не может говорить на русском

 

и английском форуме я видел, никто не помогает: (

 

Попробуй писать auf dem Deutschen и на Русском (ориентируясь этой формой)... приложив усилия, чтобы тебя можно было бы понять. Слово gespwant и в немецком отсутствует.

Но если вопросы не будут понятны - лучше не мусорить в топике. --/Artos

 

olaf1, а вот я не верю, что это не ты - IP совпадает. :-) Правилами форума запрещено создавать несколько профилей... Этот профиль блокирую. Cyclone

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...