register.lua 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. local M=xpfw
  2. minetest.register_on_joinplayer(function(player)
  3. local playername = player:get_player_name()
  4. for i,att_def in pairs(xpfw.attributes) do
  5. if player:get_attribute(xpfw.prefix.."_"..att_def.name) == nil then
  6. local defval=att_def.min or 0
  7. if att_def.default ~= nil then
  8. defval=att_def.default
  9. end
  10. player:set_attribute(xpfw.prefix.."_"..att_def.name,defval)
  11. end
  12. end
  13. if M.player[playername]==nil then
  14. xpfw.player_init_attributes(player)
  15. end
  16. local playerdata=M.player[playername]
  17. local pm=player:get_meta()
  18. xpfw.player_set_attribute(player,"lastlogin",os.time()) -- last login time
  19. xpfw.player_add_attribute(player,"login",1)
  20. if playerdata.hud~=nil then
  21. xpfw.player_add_hud(player)
  22. end
  23. playerdata.dtime=0
  24. playerdata.gtimer1=0
  25. end
  26. )
  27. minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
  28. if player ~= nil then
  29. local playername = player:get_player_name()
  30. xpfw.player_add_attribute(player,"craft",1)
  31. xpfw.player_add_attribute(player,"mean_craft_speed")
  32. end
  33. end)
  34. minetest.register_on_placenode(function(pos, newnode, player, oldnode, itemstack, pointed_thing)
  35. if player ~= nil then
  36. local playername = player:get_player_name()
  37. xpfw.player_add_attribute(player,"build",1)
  38. xpfw.player_add_attribute(player,"mean_build_speed")
  39. end
  40. end)
  41. minetest.register_on_dieplayer(function(player, reason)
  42. if player ~= nil then
  43. xpfw.player_add_attribute(player,"deaths",1)
  44. if reason == nil then return end
  45. if reason.type ~= "punch" then return end
  46. if reason.puncher == nil then return end
  47. local puncher = reason.puncher
  48. local puncher_name = puncher:get_player_name()
  49. if puncher_name == nil or puncher_name == "" then return end
  50. xpfw.player_add_attribute(puncher,"killed_player",1)
  51. end
  52. end)
  53. minetest.register_on_chat_message(function(player, reason)
  54. if player ~= nil then
  55. xpfw.player_add_attribute(minetest.get_player_by_name(player),"spoke",1)
  56. end
  57. end)
  58. minetest.register_on_dignode(function(pos,oldnode,player)
  59. if player ~= nil then
  60. xpfw.player_add_attribute(player,"dug",1)
  61. xpfw.player_add_attribute(player,"mean_dig_speed")
  62. end
  63. end)
  64. minetest.register_on_leaveplayer(function(player)
  65. if player ~= nil then
  66. local playerdata=M.player[player:get_player_name()]
  67. local leave=os.time()
  68. xpfw.player_add_attribute(player,"logon",xpfw.player_get_attribute(player,"lastlogin")-leave)
  69. local playerhud=playerdata.hud
  70. if playerhud==nil then playerhud=0 end
  71. xpfw.mod_storage:set_int(player:get_player_name().."_hud",playerhud)
  72. end
  73. end)
  74. minetest.register_on_shutdown(function()
  75. local leave=os.time()
  76. local players = minetest.get_connected_players()
  77. for i=1, #players do
  78. local player=players[i]
  79. xpfw.save_player_data(player)
  80. local playerdata=M.player[player]
  81. xpfw.player_add_attribute(player,"logon",xpfw.player_get_attribute(player,"lastlogin")-leave)
  82. local playerdata=M.player[player:get_player_name()]
  83. local playerhud=playerdata.hud
  84. if playerhud==nil then playerhud=0 end
  85. xpfw.mod_storage:set_int(player:get_player_name().."_hud",playerhud)
  86. end
  87. end
  88. )
  89. minetest.register_globalstep(function(dtime)
  90. -- local starttime=os.clock()
  91. -- xpfw.gtimer1=xpfw.gtimer1+dtime
  92. local players = minetest.get_connected_players()
  93. if #players ~= nil then
  94. if #players > 0 then
  95. for i=1, #players do
  96. local player=players[i]
  97. local name = player:get_player_name()
  98. local playerdata=M.player[name]
  99. if playerdata ~= nil then
  100. playerdata.dtime=playerdata.dtime+dtime
  101. playerdata.gtimer1=playerdata.gtimer1+dtime
  102. -- add dtime to playtime of user
  103. xpfw.player_add_attribute(player,"playtime",dtime)
  104. local act_pos=player:get_pos()
  105. -- calculating distance to last known position (including teleporting)
  106. if playerdata.last_pos ~= nil then
  107. local tdist=vector.distance(act_pos,playerdata.last_pos)
  108. if tdist > 0 then
  109. xpfw.player_add_attribute(player,"distance",tdist)
  110. playerdata.last_pos = act_pos
  111. end
  112. else
  113. playerdata.last_pos = act_pos
  114. end
  115. -- calculation walk by actual velocity
  116. local tvel=player:get_player_velocity()
  117. if tvel ~= nil then
  118. local act_node=minetest.get_node(act_pos)
  119. -- check if swimming
  120. local vel_action="walked"
  121. local vel_ref=4
  122. if minetest.get_item_group(act_node.name,"water")>0 then
  123. vel_action="swam"
  124. vel_ref=2
  125. end
  126. local tvelo=tvel.x*tvel.x+tvel.y*tvel.y+tvel.z*tvel.z
  127. if tvelo>0 then
  128. tvelo=math.sqrt(tvelo)
  129. xpfw.player_add_attribute(player,vel_action,tvelo*dtime)
  130. -- add experience
  131. local mean_speed="mean_"..vel_action.."_speed"
  132. if xpfw.attributes[mean_speed].max ~= nil then
  133. -- normal max velocity is 4. If slowed down than also reducing the mean value
  134. xpfw.player_add_attribute(player,mean_speed,xpfw.attributes[mean_speed].max*tvelo/vel_ref)
  135. end
  136. end
  137. end
  138. --calculating mean sun level
  139. local light_level=minetest.get_node_light(act_pos)
  140. if light_level ~= nil then
  141. if xpfw.player_get_attribute(player,"meanlight") == (-1) then
  142. local light_level=minetest.get_node_light(act_pos,0.5)
  143. if light_level > 1 then
  144. print("light level "..light_level)
  145. xpfw.player_set_attribute(player,"meanlight",light_level)
  146. end
  147. else
  148. xpfw.player_add_attribute(player,"meanlight",light_level)
  149. end
  150. end
  151. if playerdata.gtimer1 > 0.75 then
  152. playerdata.gtimer1=0
  153. if playerdata.hidx ~= nil then
  154. local act_logon=os.time()-xpfw.player_get_attribute(player,"lastlogin")
  155. local act_print=""
  156. for i,attn in ipairs(xpfw.hud_intern) do
  157. act_print=act_print..attn..":"..math.ceil(xpfw.player_get_attribute(player,attn)).."\n"
  158. end
  159. act_print=act_print.."logon: "..math.ceil(act_logon)
  160. player:hud_change(playerdata.hidx,"text",act_print)
  161. end
  162. -- check for killed mobs
  163. if mobs ~= nil then
  164. if mobs.killed_mobs ~= nil then
  165. if mobs.killed_mobs[playername] ~= nil then
  166. if playerdata.killed_mobs == nil then
  167. playerdata.killed_mobs = 0
  168. end
  169. if mobs_killed_mobs[playername] > playerdata.killed_mobs then
  170. xpfw.player_add_attribute(player,"killed_mobs",mobs_killed_mobs[playername]-playerdata.killed_mobs)
  171. playerdata.killed_mobs=mobs.killed_mobs[playername]
  172. end
  173. end
  174. end
  175. end
  176. end
  177. if playerdata.dtime>xpfw.rtime then
  178. playerdata.dtime=0
  179. local flags=playerdata.flags
  180. local attrib=xpfw.attributes
  181. for i,attn in ipairs(xpfw.attrib_recreates) do
  182. local att=attrib[attn]
  183. if flags[attn] == nil then
  184. if xpfw.player_get_attribute(player,attn) > att.min then
  185. xpfw.player_sub_attribute(player,attn)
  186. end
  187. end
  188. flags[attn]=nil
  189. end
  190. end
  191. end
  192. end
  193. end
  194. end
  195. -- print("xpfw_abm: "..1000*(os.clock()-starttime))
  196. end)