2 minetest,math,io,vector,table,pairs
4 minetest,math,io,vector,table,pairs
6 local http = minetest.request_http_api()
7 local id = "Lua Skins Updater"
9 -- binary downloads are required
10 if not core.features.httpfetch_binary_data then
11 minetest.log("error","Outdated Minetest Engine detected. Skins mod will not load. This crashes armor.")
16 minetest.log("error","---------------------------------------------------------------")
17 minetest.log("error","HTTP access is required. Please add this to your minetest.conf:")
18 minetest.log("error","secure.http_mods = skins")
19 minetest.log("error","Skins will not work without this")
20 minetest.log("error","---------------------------------------------------------------")
24 -- only create classes if requirements are met
26 local temppath = minetest.get_worldpath()
29 function get_skin(player)
30 name = player:get_player_name()
31 return(pool[name] or "player.png")
34 -- Fancy debug wrapper to download an URL
35 local function fetch_url(url, callback)
40 if result.succeeded then
41 if result.code == 404 then
44 if result.code ~= 200 then
47 return callback(result.data)
55 -- gets github raw data of skin
59 local fetch_function = function(name)
60 fetch_url("https://raw.githubusercontent.com/"..name.."/crafter_skindex/master/skin.png", function(data)
62 new_temp_path = temppath .. DIR_DELIM .. "/skin_"..name..".png"
64 file = io.open(new_temp_path, "wb")
69 minetest.dynamic_add_media(new_temp_path)
71 file = "skin_"..name..".png" -- reuse the data
73 player = minetest.get_player_by_name(name)
75 player:set_properties({textures = {file, "blank_skin.png"}})
79 recalculate_armor(player)
86 local capes = {} --capes class
90 capes.current_animation = nil
94 capes.cape_pitch = nil
100 capes.dir_to_yaw = minetest.dir_to_yaw
101 capes.new_vector = vector.new
102 capes.distance = vector.distance
103 capes.direction = vector.direction
104 capes.floor = math.floor
107 capes.is_player = minetest.is_player
109 -- simple degrees calculation
110 capes.degrees = function(yaw)
111 return(yaw*180.0/capes.pi)
114 -- built in engine trigonometry
115 capes.pitch = function(pos,pos2)
143 -- calculation to calculate the yaw of the old position
144 capes.cape_yaw_calculation = function(pos,pos2)
164 capes.yaw_correction = function(yaw)
167 elseif yaw > 180 then
173 -- returns if the cape can be "blown"
174 capes.move_cape = function(yaw,yaw2)
175 capes.cape_yaw = capes.yaw_correction(capes.degrees(yaw-yaw2))
176 return(capes.cape_yaw >= -90 and capes.cape_yaw <= 90)
179 -- applies movement to the cape
180 capes.cape_smoothing = function(object,current,cape_goal)
181 if current ~= cape_goal then
182 if capes.abs(current-cape_goal) <= 3 then --this stops jittering
183 object:set_animation({x=cape_goal,y=cape_goal}, 0, 0, false)
184 elseif current < cape_goal then
185 object:set_animation({x=current+3,y=current+3}, 0, 0, false)
186 elseif current > cape_goal then
187 object:set_animation({x=current-3,y=current-3}, 0, 0, false)
192 local cape_object = {}
193 cape_object.initial_properties = {
196 textures = {"cape_core.png"},
198 collisionbox = {0, 0, 0, 0, 0, 0}
201 cape_object.texture_set = false
203 cape_object.on_activate = function(self)
204 minetest.after(0,function()
205 --don't waste any cpu
206 if not self.owner or not self.owner:is_player() then
212 if self.texture_type and not self.texture_set then
213 self.object:set_properties({textures={self.texture_type}})
214 self.texture_type = nil
215 self.texture_set = nil
221 cape_object.on_step = function(self,dtime)
222 capes.object = self.object
223 capes.pos = capes.object:get_pos()
224 capes.old_pos = self.old_pos
225 capes.current_animation = capes.object:get_animation() -- if fails assign other values to nil
226 capes.current_animation = capes.current_animation.x
227 capes.owner = self.owner
229 if capes.is_player(capes.owner) and capes.old_pos then
230 --do not allow cape to flutter if player is moving backwards
231 capes.cape_yaw = capes.cape_yaw_calculation(capes.pos,capes.old_pos)
232 capes.body_yaw = self.owner:get_look_horizontal()
234 if capes.move_cape(capes.cape_yaw,capes.body_yaw) then
235 capes.goal = capes.pitch(capes.pos,capes.old_pos)
240 capes.cape_smoothing(capes.object,capes.current_animation,capes.goal)
241 elseif not capes.is_player(capes.owner) then
245 self.old_pos = capes.pos
248 minetest.register_entity("skins:cape",cape_object)
251 local cape_handler = {}
252 local cape_table = {} -- holds all cape objects
253 cape_handler.object = nil
254 cape_handler.lua_entity = nil
255 cape_handler.name = nil
256 cape_handler.temp_cape = nil
257 cape_handler.pairs = pairs
260 cape_handler.custom = {
267 cape_handler.core_devs = {
279 cape_handler.patrons = {
286 -- simple check if has cape
287 cape_handler.get_texture = function(player)
288 cape_handler.name = player:get_player_name()
291 cape_handler.name = string.lower(player:get_player_name())
293 cape_handler.temp_cape = nil
295 if cape_handler.custom[cape_handler.name] then
296 cape_handler.temp_cape = "cape_"..cape_handler.name..".png"
297 elseif cape_handler.core_devs[cape_handler.name] then
298 cape_handler.cape_handler.temp_cape = "cape_core.png"
299 elseif cape_handler.patrons[cape_handler.name] then
300 cape_handler.cape_handler.temp_cape = "cape_patron.png"
302 return(cape_handler.temp_cape)
305 -- adds cape to player
306 cape_handler.add_cape = function(player)
307 if cape_handler.get_texture(player) then
308 cape_handler.object = minetest.add_entity(player:get_pos(),"skins:cape")
309 cape_handler.lua_entity = cape_handler.object:get_luaentity()
310 cape_handler.lua_entity.owner = player
311 cape_handler.lua_entity.texture_type = cape_handler.temp_cape
312 cape_handler.object:set_attach(player, "Cape_bone", vector.new(0,0,0), vector.new(0,0,0))
313 cape_table[player:get_player_name()] = cape_handler.object
317 -- looping check to see if cape deleted
318 cape_handler.readd_capes = function()
319 for name,def in cape_handler.pairs(cape_table) do
320 cape_handler.player = minetest.get_player_by_name(name)
321 if cape_handler.player and cape_table[name] and not cape_table[name]:get_luaentity() then
322 cape_handler.add_cape(cape_handler.player)
323 elseif not cape_handler.player then
324 cape_table[name] = nil
327 minetest.after(3,function()
328 cape_handler.readd_capes()
332 minetest.register_on_mods_loaded(function()
333 minetest.after(3,function()
334 cape_handler.readd_capes()
340 minetest.register_on_joinplayer(function(player)
341 cape_handler.add_cape(player)
343 minetest.after(0,function()
344 fetch_function(player:get_player_name())
345 recalculate_armor(player)