All pastes #445943 Raw Edit

Chao7

public lua v1 · immutable
·published 2007-04-18 05:27 UTC
rendered paste body
--' Êëþ÷åì ÿâëÿåòñÿ ãðóïïèðîâêà ïåðñîíàæà. Çíà÷åíèåì ÿâëÿåòñÿ òàáëèöà, ñîäåðæàøàÿ èìåíà ñåêöèé ïðåäìåòîâ.local item_by_community = {}--' Çàâèñèìîñòè â ñïàóíå ïðåäìåòîâ. Ïðåäìåò ñïàóíèòüñÿ òîëüêî åñëè åñòü õîòÿ áû îäèí èç çàâèñèìûõ.local item_dependence = {}--' Ìíîæèòåëè è ìèíèìàêñû äëÿ âûïàäåíèÿ âåùåé â çàâèñèìîñòè îò óðîâíÿlocal mul_by_level = {}local count_by_level = {}--' Ïðåäìåòû, êîòîðûå íåëüçÿ óäàëÿòü (êâåñòîâûå íàïðèìåð)local always_keep_item = {}--' Ïðåäìåòû, îòíîñÿùèåñÿ ê ïàòðîíàì. Èõ íàäî ñïàóíèòü äðóãèì ìåòîäîì.local ammo_sections = {}local death_ini = ini_file("misc\\death_generic.ltx")function init_drop_settings()	local community_list = { "stalker", "dolg", "freedom", "bandit", "military", "zombied", "ecolog", "killer", "monolith", "arena_enemy", "actor_dolg" }	    for k,v in pairs(community_list) do        --' Íåîáõîäèìî çàïîëíèòü òàáëèöó        item_by_community[v] = {}        if death_ini:section_exist(v) then		    local n = death_ini:line_count(v)		    local id, value = "", ""		    for i=0,n-1 do			    result, id, value	= death_ini:r_line(v,i,"","")                item_by_community[v][id] = 100*tonumber(value)		    end        end    end    --' Çàïîëíÿåì òàáëèöó çàâèñèìîñòåé	local n = death_ini:line_count("item_dependence")	local id, value = "", ""	for i=0,n-1 do		result, id, value	= death_ini:r_line("item_dependence",i,"","")		item_dependence[id] = {}		local vvv = parse_names(value)		for k,v in pairs(vvv) do			item_dependence[id][v] = true		end	end	--' Ìíîæèòåëè è ìèíèìàêñû äëÿ âûïàäåíèÿ âåùåé â çàâèñèìîñòè îò óðîâíÿ    local level_name = level.name()		if not death_ini:section_exist(level_name) then		level_name = "default"	end    local n = death_ini:line_count(level_name)	local id, value = "", ""	for i=0,n-1 do		result, id, value	= death_ini:r_line(level_name,i,"","")        mul_by_level[id] = tonumber(value)	end            local item_count_section = "item_count_" .. level.get_game_difficulty()    local n = death_ini:line_count(item_count_section)	for i=0,n-1 do		result, id, value	= death_ini:r_line(item_count_section,i,"","")        --' Íóæíî ðàñïàðñèòü value â äâà çíà÷åíèÿ        local t = parse_nums(value)		if t[1] == nil then            abort("Error on [death_ini] declaration. Section [%s], line [%s]", item_count_section, tostring(id))        end        local min = t[1]        local max = t[2]        if max == nil then            max = min        end                if mul_by_level[id] == nil then            mul_by_level[id] = 0        end        min = tonumber(min) * mul_by_level[id]        max = tonumber(max) * mul_by_level[id]        count_by_level[id] = {min = min, max = max}	end         	--' Ïðåäìåòû, êîòîðûå íåëüçÿ óäàëÿòü (êâåñòîâûå íàïðèìåð)    local n = death_ini:line_count("keep_items")	for i=0,n-1 do		result, id, value	= death_ini:r_line("keep_items",i,"","")        if value == "true" then            always_keep_item[id] = true        end    end	--' Ïðåäìåòû, îòíîñÿùèåñÿ ê ïàòðîíàì. Èõ íàäî ñïàóíèòü äðóãèì ìåòîäîì.    ammo_sections = {}    local n = death_ini:line_count("ammo_sections")	local id, value = "", ""	for i=0,n-1 do		result, id, value	= death_ini:r_line("ammo_sections",i,"","")        ammo_sections[id] = true	end        endclass "drop_manager"function drop_manager:__init(npc)	self.npc = npcendfunction drop_manager:create_release_item()	--' Ñïðàøèâàåì ó ñåðâåðíîãî îáúåêòà ãåíåðèëèñü ëè ïðåäìåòû	local se_obj = alife():object(self.npc:id())	if se_obj.death_droped == true then		return	end	se_obj.death_droped = true    --' Çàïóñêàåì èòåðàòîð íà óäàëåíèå ïðåäìåòîâ    self.npc:iterate_inventory(keep_item, self.npc)    --' Ïðîâåðêà íà îòñóòñòâèå ñïàóíà ëóòà    local ini = self.npc:spawn_ini()    if ini and ini:section_exist("dont_spawn_loot") then        return    end    --' Äîñïàâíèâàåì íåîáõîäèìîå êîëè÷åñòâî èòåìîâ:    --' Íåîáõîäèìî ñîñòàâèòü ñïèñîê îáúåêòîâ êîòîðûå ìîãóò áûòü çàñïàâíåíû äëÿ ïåðñîíàæà    local spawn_items = item_by_community[self.npc:character_community()]        if spawn_items ~= nil then        for k,v in pairs( spawn_items ) do            --' Ïî êàæäîìó îáúåêòó íåîáõîäèìî ïîëó÷èòü çàâèñèìîñòè		            if check_item_dependence(self.npc, k) == true then                --' Ïî êàæäîìó îáúåêòó íåîáõîäèìî ïîëó÷èòü êîëè÷åñòâî                local number = math.ceil(math.random(count_by_level[k].min, count_by_level[k].max))                --' Íåîáõîäèìî çàñïàâíèòü íóæíîå êîëè÷åñòâî.                create_items(self.npc, k, number, v)            end        end    endend--' Ôóíêöèÿ âûçûâàåòñÿ äëÿ êàæäîãî ïðåäìåòà, åñëè âåðíåò false òî ïðåäìåò óäàëèòñÿ.function keep_item(npc, item)    local section = item:section()    if section == "bolt" then        return    end    if always_keep_item[section] == true then        return    end    local item_id = item:id()    local item_in_slot = npc:item_in_slot(1)    if item_in_slot ~= nil and       item_in_slot:id() == item_id    then        item:unload_magazine()		--' Òóò íàäî óìåíüøèòü êîíäèøí îðóæèÿ		item:set_condition((math.random(15)+75)/100)        return    end    item_in_slot = npc:item_in_slot(2)    if item_in_slot ~= nil and       item_in_slot:id() == item_id    then        item:unload_magazine()		--' Òóò íàäî óìåíüøèòü êîíäèøí îðóæèÿ		item:set_condition((math.random(15)+75)/100)        return    end    npc:mark_item_dropped(item)    alife():release(alife():object(item:id()), true)end--' Ôóíêöèÿ ñïàâíèò íåîáõîäèìîå ÷èñëî ïðåäìåòîâfunction create_items(npc, section, number, rnd)    --'printf("create %s of %s", tostring(number), tostring(section))    if ammo_sections[section] == true then        if number > 0 then            se_respawn.create_ammo(section,					    npc:position(),				    npc:level_vertex_id(),					    npc:game_vertex_id(),				    npc:id(),                    number)        end    else        for i=1,number do			--' Ïðîâåðÿåì âåðîÿòíîñòü ïîÿâèòü êàæäûé îáúåêò â îòäåëüíîñòè            if math.random(100) <=  rnd then				alife():create(section,						    npc:position(),						npc:level_vertex_id(),							npc:game_vertex_id(),						npc:id())			end        end    end    end--' Ôóíêöèÿ ïðîâåðÿåò åñòü ëè õîòü îäèí èç çàâèñèìûõ îáúåêòîâ ó ïåðñîíàæàfunction check_item_dependence(npc, section)	if item_dependence[section] == nil then		return true	end    local d_flag = true    for k,v in pairs(item_dependence[section]) do        local obj = npc:object(k)        if obj ~= nil and npc:marked_dropped(obj) ~= true then            return true        end        d_flag = false    end    return d_flagend