added new command: village_mob_repopulate

This commit is contained in:
Sokomine 2017-07-28 16:41:52 +02:00
parent d0fdb227c6
commit 75d0f49027
3 changed files with 79 additions and 5 deletions

View File

@ -234,3 +234,43 @@ minetest.register_chatcommand( 'visit', {
minetest.chat_send_player( name, "There is no village with the number "..tostring( param ).." (yet?).");
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
});

View File

@ -1160,8 +1160,30 @@ mg_villages.inhabitants.spawn_mobs_for_one_house = function( bpos, minp, maxp, v
end
-- spawn mobs in villages
mg_villages.inhabitants.part_of_village_spawned = function( village, minp, maxp, data, param2_data, a, cid )
-- calculate which mob works and lives where
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
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
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
local village_id = tostring( village.vx )..':'..tostring( village.vz );
mg_villages.inhabitants.spawn_mobs_for_one_house( bpos, minp, maxp, village_id, plot_nr );

View File

@ -1235,11 +1235,14 @@ mg_villages.place_villages_via_voxelmanip = function( villages, minp, maxp, vm,
t1 = time_elapsed( t1, 'do fill chests' );
-- 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
local village_id = tostring( village.vx )..':'..tostring( village.vz );
-- this is a good time to analyze the road network as well
mg_villages.get_road_list( village_id, true );
-- analyze road network, assign workers to buildings, assign mobs to beds
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
if( pos.workplaces and #pos.workplaces>0) then
for workplace_nr, wp in ipairs( pos.workplaces ) do