summaryrefslogtreecommitdiff
path: root/src/game.cpp
Commit message (Expand)AuthorAge
* Bugfix: else repeat_rightclick_timer = 0;PilzAdam2013-01-14
* Add particlesJeija2013-01-14
* Disable all HP handling if enable_damage is falsePilzAdam2013-01-07
* Fix buttons not working for Lua-triggered formspecssapier2013-01-07
* Fix typo doubletab -> doubletapPilzAdam2013-01-04
* Switch to fly mode if spacebar is doubleclickedPilzAdam2013-01-04
* Repeated right clicking when holding the right mouse buttonJeija2013-01-04
* Adjust the maximum alpha of the red hurt screenPilzAdam2013-01-03
* Tilt camera on player damage (tweaked by PilzAdam)Jeija2013-01-03
* Replace constant red hurt screen with fade out redPilzAdam2013-01-02
* Add TOCLIENT_SHOW_FORMSPEC to display formspecs at client from luasapier2013-01-02
* Add selectionbox_color, crosshair_color, and crosshair_alpha optionsEsteban I. Ruiz Moreno2012-12-27
* Only fly through walls in noclip mode wich requires the noclip privilegePilzAdam2012-12-11
* Update GUI textsPerttu Ahola2012-12-06
* draw gui later. this fixes the hotbar disappearing while rendering to texture.Jürgen Doser2012-12-06
* Smooth day-night transitionsPerttu Ahola2012-12-02
* Handle day-night transition in shader and make light sources brighter when sh...Perttu Ahola2012-12-02
* Implement a global shader parameter passing system and useful shadersPerttu Ahola2012-12-02
* ShaderSource and silly example shadersKahrl2012-12-02
* On-demand item meshes and texturesPerttu Ahola2012-12-02
* Merge support for anaglyph stereoPilzAdam2012-12-01
|\
| * Anaglyph stereo support, created by xyzMirceaKitsune2012-11-13
* | Make dragged itemstack following the mouse cursor much smootherJürgen Doser2012-11-30
* | RealBadAngel's patch which allows the lua api to read pressed player keys. Th...MirceaKitsune2012-11-25
|/
* Reorganize ClientMap rendering code for a bit more performancePerttu Ahola2012-09-04
* Fix building on top of (pointable && buildable_to) nodesPerttu Ahola2012-07-23
* minetest.register_on_player_receive_fields()Perttu Ahola2012-07-22
* Implement formspecdarkrose2012-07-22
* Fix signed overflow in getPointedThingBad-Command2012-07-21
* Server-side checking of digging; disable_anticheat settingPerttu Ahola2012-07-21
* Allow defining player's inventory form in LuaPerttu Ahola2012-07-19
* Custom boxy nodes (stairs, slabs) and collision changesKahrl2012-06-17
* Optimize headersPerttu Ahola2012-06-17
* Allow node cracking animations of any lengthPerttu Ahola2012-06-16
* Node texture animationPerttu Ahola2012-06-16
* Node placement client-side predictionPerttu Ahola2012-06-10
* Remove a random old comment and a #define from game.cppPerttu Ahola2012-06-09
* Switch the license to be LGPLv2/later, with small parts still remaining as GP...Perttu Ahola2012-06-05
* Update inventory menu from formspec on-the-flyPerttu Ahola2012-06-03
* Implement image[<X>,<Y>;<W>,<H>;<texture name>] and allow floating-point valu...Perttu Ahola2012-06-03
* Reshape inventory menu codePerttu Ahola2012-06-03
* Implement sign using form field protocolPerttu Ahola2012-06-03
* Strip unneeded variables from NodeMetadatadarkrose2012-06-03
* WIP node metadata, node timersKahrl2012-06-03
* Handle failing openal init properly, add enable_sound and sound_volume settingsPerttu Ahola2012-04-06
* Show reported map seed on debug info (F5)Perttu Ahola2012-04-04
* Fix sound direction and add experimental:soundblock alias sb in minimal for t...Perttu Ahola2012-04-04
* Add 'fly' and 'fast' privileges and the underlying privileges-to-client systemPerttu Ahola2012-03-31
* Change postfixes from N.ogg to .N.ogg in user/testsounds/ loaderPerttu Ahola2012-03-25
* Some serialization version stuffPerttu Ahola2012-03-25
span class="hl opt">]={} end ndb_nodes[y][x][z]=v end local path=minetest.get_worldpath()..DIR_DELIM.."advtrains_ndb2" --load --nodeids get loaded by advtrains init.lua and passed here function ndb.load_data(data) ndb_nodeids = data and data.nodeids or {} local file, err = io.open(path, "rb") if not file then atwarn("Couldn't load the node database: ", err or "Unknown Error") else local cnt=0 local hst_z=file:read(2) local hst_y=file:read(2) local hst_x=file:read(2) local cid=file:read(2) while hst_z and hst_y and hst_x and cid and #hst_z==2 and #hst_y==2 and #hst_x==2 and #cid==2 do ndbset(bytes_to_int(hst_x), bytes_to_int(hst_y), bytes_to_int(hst_z), bytes_to_int(cid)) cnt=cnt+1 hst_z=file:read(2) hst_y=file:read(2) hst_x=file:read(2) cid=file:read(2) end atlog("nodedb: read", cnt, "nodes.") file:close() end end --save function ndb.save_data() local file, err = io.open(path, "wb") if not file then atwarn("Couldn't save the node database: ", err or "Unknown Error") else for y, ny in pairs(ndb_nodes) do for x, nx in pairs(ny) do for z, cid in pairs(nx) do file:write(int_to_bytes(z)) file:write(int_to_bytes(y)) file:write(int_to_bytes(x)) file:write(int_to_bytes(cid)) end end end file:close() end return {nodeids = ndb_nodeids} end --function to get node. track database is not helpful here. function ndb.get_node_or_nil(pos) -- FIX for bug found on linuxworks server: -- a loaded node might get read before the LBM has updated its state, resulting in wrongly set signals and switches -- -> Using the saved node prioritarily. local node = ndb.get_node_raw(pos) if node then return node else --try reading the node from the map return minetest.get_node_or_nil(pos) end end function ndb.get_node(pos) local n=ndb.get_node_or_nil(pos) if not n then return {name="ignore", param2=0} end return n end function ndb.get_node_raw(pos) local cid=ndbget(pos.x, pos.y, pos.z) if cid then local nodeid = ndb_nodeids[u14b(cid)] if nodeid then return {name=nodeid, param2 = l2b(cid)} end end return nil end function ndb.swap_node(pos, node, no_inval) if minetest.get_node_or_nil(pos) then minetest.swap_node(pos, node) end ndb.update(pos, node) end function ndb.update(pos, pnode) local node = pnode or minetest.get_node_or_nil(pos) if not node or node.name=="ignore" then return end if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].groups.save_in_at_nodedb then local nid for tnid, nname in pairs(ndb_nodeids) do if nname==node.name then nid=tnid end end if not nid then nid=#ndb_nodeids+1 ndb_nodeids[nid]=node.name end ndbset(pos.x, pos.y, pos.z, (nid * 4) + (l2b(node.param2 or 0)) ) --atprint("nodedb: updating node", pos, "stored nid",nid,"assigned",ndb_nodeids[nid],"resulting cid",ndb_nodes[hash]) else --at this position there is no longer a node that needs to be tracked. ndbset(pos.x, pos.y, pos.z, nil) end end function ndb.clear(pos) ndbset(pos.x, pos.y, pos.z, nil) end --get_node with pseudoload. now we only need track data, so we can use the trackdb as second fallback --nothing new will be saved inside the trackdb. --returns: --true, conn1, conn2, rely1, rely2, railheight in case everything's right. --false if it's not a rail or the train does not drive on this rail, but it is loaded or --nil if the node is neither loaded nor in trackdb --the distraction between false and nil will be needed only in special cases.(train initpos) function advtrains.get_rail_info_at(pos, drives_on) local rdp=advtrains.round_vector_floor_y(pos) local node=ndb.get_node_or_nil(rdp) if not node then return end local nodename=node.name if(not advtrains.is_track_and_drives_on(nodename, drives_on)) then return false end local conns, railheight, tracktype=advtrains.get_track_connections(node.name, node.param2) return true, conns, railheight end ndb.run_lbm = function(pos, node) return advtrains.pcall(function() local cid=ndbget(pos.x, pos.y, pos.z) if cid then --if in database, detect changes and apply. local nodeid = ndb_nodeids[u14b(cid)] local param2 = l2b(cid) if not nodeid then --something went wrong atwarn("Node Database corruption, couldn't determine node to set at", pos) ndb.update(pos, node) else if (nodeid~=node.name or param2~=node.param2) then atprint("nodedb: lbm replaced", pos, "with nodeid", nodeid, "param2", param2, "cid is", cid) minetest.swap_node(pos, {name=nodeid, param2 = param2}) local ndef=minetest.registered_nodes[nodeid] if ndef and ndef.on_updated_from_nodedb then ndef.on_updated_from_nodedb(pos, node) end return true end end else --if not in database, take it. --atlog("Node Database:", pos, "was not found in the database, have you used worldedit?") ndb.update(pos, node) end return false end) end minetest.register_lbm({ name = "advtrains:nodedb_on_load_update", nodenames = {"group:save_in_at_nodedb"}, run_at_every_load = true, run_on_every_load = true, action = ndb.run_lbm, interval=30, chance=1, }) --used when restoring stuff after a crash ndb.restore_all = function() --atlog("Updating the map from the nodedb, this may take a while") local cnt=0 local dcnt=0 for y, ny in pairs(ndb_nodes) do for x, nx in pairs(ny) do for z, _ in pairs(nx) do local pos={x=x, y=y, z=z} local node=minetest.get_node_or_nil(pos) if node then local ori_ndef=minetest.registered_nodes[node.name] local ndbnode=ndb.get_node_raw(pos) if ori_ndef and ori_ndef.groups.save_in_at_nodedb then --check if this node has been worldedited, and don't replace then if (ndbnode.name~=node.name or ndbnode.param2~=node.param2) then minetest.swap_node(pos, ndbnode) --atlog("Replaced",node.name,"@",pos,"with",ndbnode.name) cnt=cnt+1 end else ndb.clear(pos) dcnt=dcnt+1 --atlog("Found ghost node (former",ndbnode and ndbnode.name,") @",pos,"deleting") end end end end end local text="Restore node database: Replaced "..cnt.." nodes, removed "..dcnt.." ghost nodes." atlog(text) return text end minetest.register_on_dignode(function(pos, oldnode, digger) return advtrains.pcall(function() ndb.clear(pos) end) end) function ndb.get_nodes() return ndb_nodes end function ndb.get_nodeids() return ndb_nodeids end advtrains.ndb=ndb local ptime=0 minetest.register_chatcommand("at_sync_ndb", { params = "", -- Short parameter description description = "Write node db back to map and find ghost nodes", -- Full description privs = {train_operator=true, worldedit=true}, -- Require the "privs" privilege to run func = function(name, param) return advtrains.pcall(function() if not minetest.check_player_privs(name, {server=true}) and os.time() < ptime+30 then return false, "Please wait at least 30s from the previous execution of /at_restore_ndb!" end local text = ndb.restore_all() ptime=os.time() return true, text end) end, })