added new command: village_mob_repopulate
This commit is contained in:
parent
d0fdb227c6
commit
75d0f49027
@ -234,3 +234,43 @@ minetest.register_chatcommand( 'visit', {
|
|||||||
minetest.chat_send_player( name, "There is no village with the number "..tostring( param ).." (yet?).");
|
minetest.chat_send_player( name, "There is no village with the number "..tostring( param ).." (yet?).");
|
||||||
end
|
end
|
||||||
});
|
});
|
||||||
|
|
||||||
|
minetest.register_chatcommand( 'village_mob_repopulate', {
|
||||||
|
description = "Discards old mob data and assigns beds and workplaces anew. Mobs get new names.",
|
||||||
|
params = "<village number>",
|
||||||
|
privs = {},
|
||||||
|
func = function(name, param)
|
||||||
|
|
||||||
|
|
||||||
|
if( not( minetest.check_player_privs( name, {protection_bypass=true}))) then
|
||||||
|
minetest.chat_send_player( name, "You need the 'protection_bypass' priv in order to delete all the old mob data of a village and to recalculate it anew.");
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
|
||||||
|
if( not( param ) or param == "" ) then
|
||||||
|
minetest.chat_send_player( name, "Which village do you want to repopulate? Please provide the village number!");
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
|
||||||
|
local nr = tonumber( param );
|
||||||
|
for id, v in pairs( mg_villages.all_villages ) do
|
||||||
|
-- we have found the village
|
||||||
|
if( v and v.nr == nr ) then
|
||||||
|
|
||||||
|
minetest.chat_send_player( name, "Deleting information about workplaces and beds. Recalculating. Assigning new data for village no. "..tostring( v.nr )..", called "..( tostring( v.name or 'unknown'))..".");
|
||||||
|
-- move the player to the center of the village he just changed
|
||||||
|
local player = minetest.get_player_by_name( name );
|
||||||
|
player:moveto( { x=v.vx, y=(v.vh+1), z=v.vz }, false);
|
||||||
|
|
||||||
|
local village_id = tostring( v.vx )..':'..tostring( v.vz );
|
||||||
|
-- actually do the reassigning
|
||||||
|
mg_villages.inhabitants.assign_mobs( v, village_id, true);
|
||||||
|
-- save the modified data
|
||||||
|
save_restore.save_data( 'mg_all_villages.data', mg_villages.all_villages );
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- no village found
|
||||||
|
minetest.chat_send_player( name, "There is no village with the number "..tostring( param ).." (yet?).");
|
||||||
|
end
|
||||||
|
});
|
||||||
|
@ -1160,8 +1160,30 @@ mg_villages.inhabitants.spawn_mobs_for_one_house = function( bpos, minp, maxp, v
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- spawn mobs in villages
|
-- calculate which mob works and lives where
|
||||||
mg_villages.inhabitants.part_of_village_spawned = function( village, minp, maxp, data, param2_data, a, cid )
|
mg_villages.inhabitants.assign_mobs = function( village, village_id, force_repopulate )
|
||||||
|
-- make sure mobs get assigned only once (no point in doing this every time
|
||||||
|
-- when part of a village spawned)
|
||||||
|
if( village.mob_data_version and not(force_repopulate)) then
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
|
||||||
|
-- if force_repopulate is true: recalculate road network, discard all worker- and
|
||||||
|
-- bed data and create new mobs
|
||||||
|
if( force_repopulate ) then
|
||||||
|
for plot_nr,bpos in ipairs(village.to_add_data.bpos) do
|
||||||
|
-- delete information about who works here
|
||||||
|
bpos.worker = nil;
|
||||||
|
-- delete information about who lives here
|
||||||
|
bpos.beds = nil;
|
||||||
|
-- delete information about the interconnection of the road network
|
||||||
|
bpos.xdir = nil;
|
||||||
|
bpos.parent_road_plot = nil;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- analyze the road network
|
||||||
|
mg_villages.get_road_list( village_id, true );
|
||||||
|
|
||||||
-- some types of buildings require special workers
|
-- some types of buildings require special workers
|
||||||
village.to_add_data.bpos = mg_villages.inhabitants.assign_jobs_to_houses( village.to_add_data.bpos );
|
village.to_add_data.bpos = mg_villages.inhabitants.assign_jobs_to_houses( village.to_add_data.bpos );
|
||||||
@ -1171,7 +1193,16 @@ mg_villages.inhabitants.part_of_village_spawned = function( village, minp, maxp,
|
|||||||
|
|
||||||
-- each bed gets a mob assigned
|
-- each bed gets a mob assigned
|
||||||
bpos = mg_villages.inhabitants.assign_mobs_to_beds( bpos, plot_nr, village.to_add_data.bpos, village );
|
bpos = mg_villages.inhabitants.assign_mobs_to_beds( bpos, plot_nr, village.to_add_data.bpos, village );
|
||||||
|
end
|
||||||
|
-- later versions may become incompatible
|
||||||
|
village.mob_data_version = 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- spawn mobs in villages
|
||||||
|
mg_villages.inhabitants.part_of_village_spawned = function( village, minp, maxp, data, param2_data, a, cid )
|
||||||
|
-- for each building in the village
|
||||||
|
for plot_nr,bpos in ipairs(village.to_add_data.bpos) do
|
||||||
-- actually spawn the mobs
|
-- actually spawn the mobs
|
||||||
local village_id = tostring( village.vx )..':'..tostring( village.vz );
|
local village_id = tostring( village.vx )..':'..tostring( village.vz );
|
||||||
mg_villages.inhabitants.spawn_mobs_for_one_house( bpos, minp, maxp, village_id, plot_nr );
|
mg_villages.inhabitants.spawn_mobs_for_one_house( bpos, minp, maxp, village_id, plot_nr );
|
||||||
|
@ -1235,11 +1235,14 @@ mg_villages.place_villages_via_voxelmanip = function( villages, minp, maxp, vm,
|
|||||||
t1 = time_elapsed( t1, 'do fill chests' );
|
t1 = time_elapsed( t1, 'do fill chests' );
|
||||||
-- TODO: extra_calls.signs
|
-- TODO: extra_calls.signs
|
||||||
|
|
||||||
-- set up workplace markers so that they know for which mob they are responsible
|
-- set up mob data and workplace markers so that they know for which mob they are responsible
|
||||||
for _, village in ipairs(villages) do
|
for _, village in ipairs(villages) do
|
||||||
local village_id = tostring( village.vx )..':'..tostring( village.vz );
|
local village_id = tostring( village.vx )..':'..tostring( village.vz );
|
||||||
-- this is a good time to analyze the road network as well
|
-- analyze road network, assign workers to buildings, assign mobs to beds
|
||||||
mg_villages.get_road_list( village_id, true );
|
mg_villages.inhabitants.assign_mobs( village, village_id, false );
|
||||||
|
-- TODO: set up workplace markers based on what was assigned in the function above
|
||||||
|
-- TODO: also label beds?
|
||||||
|
-- set up the workplace markers
|
||||||
for building_nr_in_bpos,pos in ipairs( village.to_add_data.bpos ) do
|
for building_nr_in_bpos,pos in ipairs( village.to_add_data.bpos ) do
|
||||||
if( pos.workplaces and #pos.workplaces>0) then
|
if( pos.workplaces and #pos.workplaces>0) then
|
||||||
for workplace_nr, wp in ipairs( pos.workplaces ) do
|
for workplace_nr, wp in ipairs( pos.workplaces ) do
|
||||||
|
Loading…
x
Reference in New Issue
Block a user