Frage zum Modifizieren eines Mods

German
Post Reply
casio33
Member
Posts: 50
Joined: Sun Jan 17, 2016 08:36

Frage zum Modifizieren eines Mods

by casio33 » Post

Auf Empfehlung habe ich mir den Mod viewtopic.php?f=11&t=7263&start=125 angeschaut. Ich finde es sehr interessant, wollte aber nicht standardmäßig "villages" auf der Karte haben. Also habe ich gefragt, ob ich das "abschalten" kann, und es kam die Antwort:

"If you want to remove the villages but leave the area flattened, so you can easily build on it, replace lines 326-342 (function generate_village) of villages.lua by "return {}"."

Das habe ich versucht, aber beim Spielstart kam dann die Meldung:

Code: Select all

2016-08-18 19:29:30: WARNING[Main]: BanManager: creating C:\minetest-0.4.14\bin\..\worlds\mg neu\ipban.txt
2016-08-18 19:29:30: WARNING[Main]: NodeDefManager: Ignoring CONTENT_IGNORE redefinition
2016-08-18 19:29:30: ERROR[Main]: ModError: Failed to load and run script from C:\minetest-0.4.14\bin\..\mods\mg\init.lua:
2016-08-18 19:29:30: ERROR[Main]: C:\minetest-0.4.14\bin\..\mods\mg/villages.lua:323: 'end' expected (to close 'function' at line 315) near 'endfunction'
2016-08-18 19:29:30: ERROR[Main]: stack traceback:
2016-08-18 19:29:30: ERROR[Main]:    [C]: in function 'dofile'
2016-08-18 19:29:30: ERROR[Main]:    C:\minetest-0.4.14\bin\..\mods\mg\init.lua:341: in main chunk
2016-08-18 19:29:30: ERROR[Main]: Siehe debug.txt für Details.
Leider hat seitdem der Mod-Autor nicht mehr geantwortet. Kann mir jemand helfen, was ich falsch gemacht habe?

User avatar
Krock
Developer
Posts: 4649
Joined: Thu Oct 03, 2013 07:48
GitHub: SmallJoker
Location: Switzerland
Contact:

Re: Frage zum Modifizieren eines Mods

by Krock » Post

Damit ist gemeint, dass du diesen Abschnitt mit

Code: Select all

function generate_village()
	return {}
end
ersetzen sollst. Höchstwarscheinlich hast du dabei das "end" bei Linie 323 ausversehen gelöscht.
Look, I programmed a bug for you. >> Mod Search Engine << - Mods by Krock - DuckDuckGo mod search bang: !mtmod <keyword here>

casio33
Member
Posts: 50
Joined: Sun Jan 17, 2016 08:36

Re: Frage zum Modifizieren eines Mods

by casio33 » Post

Danke erstmal für die Antwort. Ich habe genau das gemacht, was du gesagt hast, aber nun kommt wieder eine Fehlermeldung:

Code: Select all

2016-09-15 16:48:12: WARNING[Main]: BanManager: creating C:\minetest-0.4.14\bin\..\worlds\mg neu\ipban.txt
2016-09-15 16:48:13: WARNING[Main]: NodeDefManager: Ignoring CONTENT_IGNORE redefinition
2016-09-15 16:48:15: ERROR[Main]: ModError: Failed to load and run script from C:\minetest-0.4.14\bin\..\mods\mg\init.lua:
2016-09-15 16:48:15: ERROR[Main]: C:\minetest-0.4.14\bin\..\mods\mg/villages.lua:325: '<name>' expected near 'function'
2016-09-15 16:48:15: ERROR[Main]: stack traceback:
2016-09-15 16:48:15: ERROR[Main]: 	[C]: in function 'dofile'
2016-09-15 16:48:15: ERROR[Main]: 	C:\minetest-0.4.14\bin\..\mods\mg\init.lua:341: in main chunk
2016-09-15 16:48:15: ERROR[Main]: Siehe debug.txt für Details.

casio33
Member
Posts: 50
Joined: Sun Jan 17, 2016 08:36

Re: Frage zum Modifizieren eines Mods

by casio33 » Post

Weiß jemand weiter? :(

User avatar
LRV
Helper
Posts: 378
Joined: Mon Dec 19, 2016 17:29
GitHub: Mooncarguy
In-game: Mooncarman Mooncarguy

Re: Frage zum Modifizieren eines Mods

by LRV » Post

casio33 wrote:Weiß jemand weiter? :(
Ich glaube du musst nicht die kompletten lines, sonder alles wohinter {} steht austauschen.
EDIT: Irgendwo anders musst du galube ich noch mal was entefernen/austauschen, weiß momentan leider noch nicht wo genau.
This is a cool signature. :)

bell07
Member
Posts: 604
Joined: Sun Sep 04, 2016 15:15
GitHub: bell07

Re: Frage zum Modifizieren eines Mods

by bell07 » Post

Wir können nicht sehen was Du genau gemacht hast. Aber die Fehlermeldung sagt schonmal wo etwas nicht stimmt:

Code: Select all

C:\minetest-0.4.14\bin\..\mods\mg/villages.lua:325: '<name>' expected near 'function'
Es müsste wohl die vorgeschlagene Zeile

Code: Select all

function generate_village()
sein. Bitte überprüfe diese noch einmal. ob Du diese korrekt abgetippt hast und dass dort keine nicht druckbaren Zeichen dzwischen kamen. Stelle zB. sicher dass zwischen "function" und "generate_village" ein Leerzeichen ist und nocht irgen eine Grütze.
Oder ist das Problem inzwischen gelöst? Die Post ist ja schon über einen Monat alt sehe ich gerade...

casio33
Member
Posts: 50
Joined: Sun Jan 17, 2016 08:36

Re: Frage zum Modifizieren eines Mods

by casio33 » Post

Danke für deine Antwort, leider verstehe ich nicht ganz, was du meinst.

Code: Select all

VILLAGE_CHECK_RADIUS = 2
VILLAGE_CHECK_COUNT = 1
VILLAGE_CHANCE = 28
VILLAGE_MIN_SIZE = 20
VILLAGE_MAX_SIZE = 40
FIRST_ROADSIZE = 3
BIG_ROAD_CHANCE = 0

-- Enable that for really big villages (there are also really slow to generate)
--[[VILLAGE_CHECK_RADIUS = 3
VILLAGE_CHECK_COUNT = 3
VILLAGE_CHANCE = 28
VILLAGE_MIN_SIZE = 100
VILLAGE_MAX_SIZE = 150
FIRST_ROADSIZE = 5
BIG_ROAD_CHANCE = 50]]

local function is_village_block(minp)
	local x, z = math.floor(minp.x/80), math.floor(minp.z/80)
	local vcc = VILLAGE_CHECK_COUNT
	return (x%vcc == 0) and (z%vcc == 0)
end

function villages_at_point(minp, noise1)
	if not is_village_block(minp) then return {} end
	local vcr, vcc = VILLAGE_CHECK_RADIUS, VILLAGE_CHECK_COUNT
	-- Check if there's another village nearby
	for xi = -vcr, vcr, vcc do
	for zi = -vcr, 0, vcc do
		if xi ~= 0 or zi ~= 0 then
			local mp = {x = minp.x + 80*xi, z = minp.z + 80*zi}
			local pi = PseudoRandom(get_bseed(mp))
			local s = pi:next(1, 400)
			local x = pi:next(mp.x, mp.x + 79)
			local z = pi:next(mp.z, mp.z + 79)
			if s <= VILLAGE_CHANCE and noise1:get2d({x = x, y = z}) >= -0.3 then return {} end
		end
	end
	end
	local pr = PseudoRandom(get_bseed(minp))
	if pr:next(1, 400) > VILLAGE_CHANCE then return {} end -- No village here
	local x = pr:next(minp.x, minp.x + 79)
	local z = pr:next(minp.z, minp.z + 79)
	if noise1:get2d({x = x, y = z}) < -0.3 then return {} end -- Deep in the ocean
	local type = pr:next(1, 1) -- TODO: actually make them
	local size = pr:next(VILLAGE_MIN_SIZE, VILLAGE_MAX_SIZE) -- TODO: change to type-dependant sizes
	local height = pr:next(5, 20)
	--print("A village spawned at: x = "..x..", z = "..z)
	return {{vx = x, vz = z, vs = size, vh = height, type = type}}
end

--local function dist_center2(ax, bsizex, az, bsizez)
--	return math.max((ax+bsizex)*(ax+bsizex),ax*ax)+math.max((az+bsizez)*(az+bsizez),az*az)
--end

local function inside_village2(bx, sx, bz, sz, village, vnoise)
	return inside_village(bx, bz, village, vnoise) and inside_village(bx+sx, bz, village, vnoise) and inside_village(bx, bz+sz, village, vnoise) and inside_village(bx+sx, bz+sz, village, vnoise)
end

local function choose_building(l, pr)
	--::choose::
	local btype
	while true do
		local p = pr:next(1, 3000)
		for b, i in ipairs(buildings) do
			if i.max_weight >= p then
				btype = b
				break
			end
		end
		if buildings[btype].pervillage ~= nil then
			local n = 0
			for j=1, #l do
				if l[j].btype == btype then
					n = n + 1
				end
			end
			--if n >= buildings[btype].pervillage then
			--	goto choose
			--end
			if n < buildings[btype].pervillage then
				return btype
			end
		else
			return btype
		end
	end
	--return btype
end

local function choose_building_rot(l, pr, orient)
	local btype = choose_building(l, pr)
	local rotation
	if buildings[btype].no_rotate then
		rotation = 0
	else
		if buildings[btype].orients == nil then
			buildings[btype].orients = {0,1,2,3}
		end
		rotation = (orient+buildings[btype].orients[pr:next(1, #buildings[btype].orients)])%4
	end
	local bsizex = buildings[btype].sizex
	local bsizez = buildings[btype].sizez
	if rotation%2 == 1 then
		bsizex, bsizez = bsizez, bsizex
	end
	return btype, rotation, bsizex, bsizez
end

local function placeable(bx, bz, bsizex, bsizez, l, exclude_roads)
	for _, a in ipairs(l) do
		if (a.btype ~= "road" or not exclude_roads) and math.abs(bx+bsizex/2-a.x-a.bsizex/2)<=(bsizex+a.bsizex)/2 and math.abs(bz+bsizez/2-a.z-a.bsizez/2)<=(bsizez+a.bsizez)/2 then return false end
	end
	return true
end

local function road_in_building(rx, rz, rdx, rdz, roadsize, l)
	if rdx == 0 then
		return not placeable(rx-roadsize+1, rz, 2*roadsize-2, 0, l, true)
	else
		return not placeable(rx, rz-roadsize+1, 0, 2*roadsize-2, l, true)
	end
end

local function when(a, b, c)
	if a then return b else return c end
end

local calls
local function generate_road(village, l, pr, roadsize, rx, rz, rdx, rdz, vnoise)
	local vx, vz, vh, vs = village.vx, village.vz, village.vh, village.vs
	local calls_to_do = {}
	local rxx = rx
	local rzz = rz
	local mx, m2x, mz, m2z, mmx, mmz
	mx, m2x, mz, m2z = rx, rx, rz, rz
	local orient1, orient2
	if rdx == 0 then
		orient1 = 0
		orient2 = 2
	else
		orient1 = 3
		orient2 = 1
	end
	while inside_village(rx, rz, village, vnoise) and not road_in_building(rx, rz, rdx, rdz, roadsize, l) do
		if roadsize > 1 and pr:next(1, 4) == 1 then
			--generate_road(vx, vz, vs, vh, l, pr, roadsize-1, rx, rz, math.abs(rdz), math.abs(rdx))
			calls_to_do[#calls_to_do+1] = {rx=rx+(roadsize - 1)*rdx, rz=rz+(roadsize - 1)*rdz, rdx=math.abs(rdz), rdz=math.abs(rdx)}
			m2x = rx + (roadsize - 1)*rdx
			m2z = rz + (roadsize - 1)*rdz
			rx = rx + (2*roadsize - 1)*rdx
			rz = rz + (2*roadsize - 1)*rdz
		end
		--else
			--::loop::
			local exitloop = false
			local tries = 0
			local btype, rotation, bsizex, bsizez
			local bx, bz
			while true do
				if not inside_village(rx, rz, village, vnoise) or road_in_building(rx, rz, rdx, rdz, roadsize, l) then
					exitloop = true
					break
				end
				btype, rotation, bsizex, bsizez = choose_building_rot(l, pr, orient1)
				bx = rx + math.abs(rdz) * (roadsize + 1) - when(rdx == -1, bsizex - 1, 0)
				bz = rz + math.abs(rdx) * (roadsize + 1) - when(rdz == -1, bsizez - 1, 0)
				if placeable(bx, bz, bsizex, bsizez, l) and inside_village2(bx, bsizex, bz, bsizez, village, vnoise) then
					break
				end
				if tries > 5 then
					rx = rx + rdx
					rz = rz + rdz
					tries = 0
				else
					tries = tries + 1
				end
				--goto loop
			end
			if exitloop then break end
			rx = rx + (bsizex + 1) * rdx
			rz = rz + (bsizez + 1) * rdz
			mx = rx - 2 * rdx
			mz = rz - 2 * rdz
			l[#l + 1] = {x = bx, y = vh, z = bz, btype = btype, bsizex = bsizex, bsizez = bsizez, brotate = rotation}
		--end
	end
	rx = rxx
	rz = rzz
	while inside_village(rx, rz, village, vnoise) and not road_in_building(rx, rz, rdx, rdz, roadsize, l) do
		if roadsize > 1 and pr:next(1, 4) == 1 then
			--generate_road(vx, vz, vs, vh, l, pr, roadsize-1, rx, rz, -math.abs(rdz), -math.abs(rdx))
			calls_to_do[#calls_to_do+1] = {rx=rx+(roadsize - 1)*rdx, rz=rz+(roadsize - 1)*rdz, rdx=-math.abs(rdz), rdz=-math.abs(rdx)}
			m2x = rx + (roadsize - 1)*rdx
			m2z = rz + (roadsize - 1)*rdz
			rx = rx + (2*roadsize - 1)*rdx
			rz = rz + (2*roadsize - 1)*rdz
		end
		--else
			--::loop::
			local exitloop = false
			local tries = 0
			local btype, rotation, bsizex, bsizez
			local bx, bz
			while true do
				if not inside_village(rx, rz, village, vnoise) or road_in_building(rx, rz, rdx, rdz, roadsize, l) then
					exitloop = true
					break
				end
				btype, rotation, bsizex, bsizez = choose_building_rot(l, pr, orient2)
				bx = rx - math.abs(rdz) * (bsizex + roadsize) - when(rdx == -1, bsizex - 1, 0)
				bz = rz - math.abs(rdx) * (bsizez + roadsize) - when(rdz == -1, bsizez - 1, 0)
				if placeable(bx, bz, bsizex, bsizez, l) and inside_village2(bx, bsizex, bz, bsizez, village, vnoise) then
					break
				end
				if tries > 5 then
					rx = rx + rdx
					rz = rz + rdz
					tries = 0
				else
					tries = tries + 1
				end
				--goto loop
			end
			if exitloop then break end
			rx = rx + (bsizex + 1) * rdx
			rz = rz + (bsizez + 1) * rdz
			m2x = rx - 2 * rdx
			m2z = rz - 2 * rdz
			l[#l + 1] = {x = bx, y = vh, z = bz, btype = btype, bsizex = bsizex, bsizez = bsizez, brotate = rotation}
		--end
	end
	if road_in_building(rx, rz, rdx, rdz, roadsize, l) then
		mmx = rx - 2*rdx
		mmz = rz - 2*rdz
	end
	mx = mmx or rdx*math.max(rdx*mx, rdx*m2x)
	mz = mmz or rdz*math.max(rdz*mz, rdz*m2z)
	local rxmin, rxmax, rzmin, rzmax
	if rdx == 0 then
		rxmin = rx - roadsize + 1
		rxmax = rx + roadsize - 1
		rzmin = math.min(rzz, mz)
		rzmax = math.max(rzz, mz)
	else
		rzmin = rz - roadsize + 1
		rzmax = rz + roadsize - 1
		rxmin = math.min(rxx, mx)
		rxmax = math.max(rxx, mx)
	end
	l[#l + 1] = {x = rxmin, y = vh, z = rzmin, btype = "road",
		bsizex = rxmax - rxmin + 1, bsizez = rzmax - rzmin + 1, brotate = 0}
	for _, i in ipairs(calls_to_do) do
		local new_roadsize = roadsize - 1
		if pr:next(1, 100) <= BIG_ROAD_CHANCE then
			new_roadsize = roadsize
		end
		calls[calls.index] = {village, l, pr, new_roadsize, i.rx, i.rz, i.rdx, i.rdz, vnoise}
		calls.index = calls.index+1
	end
end

local function generate_bpos(village, pr, vnoise)
	local vx, vz, vh, vs = village.vx, village.vz, village.vh, village.vs
	local l = {}
	local rx = vx - vs
	local rz = vz
	while inside_village(rx, rz, village, vnoise) do
		rx = rx - 1
	end
	rx = rx + 5
	calls = {index = 1}
	generate_road(village, l, pr, FIRST_ROADSIZE, rx, rz, 1, 0, vnoise)
	local i = 1
	while i < calls.index do
		generate_road(unpack(calls[i]))
		i = i + 1
	end
	return l
end

local function generate_building(pos, minp, maxp, data, param2_data, a, pr, extranodes)
	local binfo = buildings[pos.btype]
	local scm
	if type(binfo.scm) == "string" then
		scm = import_scm(binfo.scm)
	else
		scm = binfo.scm
	end
	scm = rotate(scm, pos.brotate)
	for x = 0, pos.bsizex - 1 do
	for y = 0, binfo.ysize - 1 do
	for z = 0, pos.bsizez - 1 do
		local ax, ay, az = pos.x + x, pos.y + y + binfo.yoff, pos.z + z
		if (ax >= minp.x and ax <= maxp.x) and (ay >= minp.y and ay <= maxp.y) and (az >= minp.z and az <= maxp.z) then
			local t = scm[y  +1][x  +1][z + 1]
			if type(t) == "table" then
				if t.extranode then
					table.insert(extranodes, {node = t.node, meta = t.meta, pos = {x = ax, y = ay, z = az}})
				else
					data[a:index(ax, ay, az)] = t.node.content
					param2_data[a:index(ax, ay, az)] = t.node.param2
				end
			elseif t ~= c_ignore then
				data[a:index(ax, ay, az)] = t
			end
		end
	end
	end
	end
end

local MIN_DIST = 1

local function pos_far_buildings(x, z, l)
	for _, a in ipairs(l) do
		if a.x - MIN_DIST <= x and x <= a.x + a.bsizex + MIN_DIST and
		   a.z - MIN_DIST <= z and z <= a.z + a.bsizez + MIN_DIST then
			return false
		end
	end
	return true
end

function generate_village(village, minp, maxp, data, param2_data, a, vnoise)
	local vx, vz, vs, vh = village.vx, village.vz, village.vs, village.vh
	local seed = get_bseed({x=vx, z=vz})
	local pr_village = PseudoRandom(seed)
	local bpos = generate_bpos(village, pr_village, vnoise)

	local pr = PseudoRandom(seed)
	for _, g in ipairs(village.to_grow) do
		if pos_far_buildings(g.x, g.z, bpos) then
			mg.registered_trees[g.id].grow(data, a, g.x, g.y, g.z, minp, maxp, pr)
		end
	end

	local extranodes = {}
	for _, pos in ipairs(bpos) do
		generate_building(pos, minp, maxp, data, param2_data, a, pr_village, extranodes)
	end
	return extranodes
end
Das hier ist der Inhalt der Datei villages.lua. Könntest du daran mal verändern, wie du es machen würdest?

Sokomine
Member
Posts: 4276
Joined: Sun Sep 09, 2012 17:31
GitHub: Sokomine
IRC: Sokomine
In-game: Sokomine

Re: Frage zum Modifizieren eines Mods

by Sokomine » Post

Füge einfach unter der Zeile

Code: Select all

function generate_village(village, minp, maxp, data, param2_data, a, vnoise)
folgendes ein:

Code: Select all

if( true ) then return {}; end

Dann werden keine Dörfer mehr generiert. Die Ebenen, auf denen eigentlich Dörfer erscheinen würden, bleiben erhalten. Falls es das ist was du willst?
A list of my mods can be found here.

Post Reply

Who is online

Users browsing this forum: No registered users and 4 guests