visuals.lua 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. local random = math.random
  2. local split = string.split
  3. local conact = table.concat
  4. local abs = math.abs
  5. local sin = math.sin
  6. local cos = math.cos
  7. local pi = math.pi
  8. local length = vector.length
  9. local flag_attach = {x = -10, y = 33, z = 10}
  10. local function set_cloth_color(obj, color)
  11. local properties = obj:get_properties()
  12. --remove underscores from colorstring
  13. color = table.concat(string.split(color, "_"))
  14. properties.textures[1] = "sailing_canoe_cloth.png^[multiply:" .. color
  15. obj:set_properties(properties)
  16. end
  17. local function set_colors(self)
  18. local flag = self.flag
  19. if flag
  20. then
  21. local color = self.flag_color
  22. set_cloth_color(flag, color)
  23. end
  24. local sail = self.sail
  25. if sail
  26. then
  27. local color = self.sail_color
  28. set_cloth_color(sail, color)
  29. end
  30. end
  31. local function dye(self, clicker)
  32. local itemstack = clicker:get_wielded_item()
  33. local name = itemstack:get_name()
  34. local name = string.split(name, ":")
  35. if not dye or name[1] ~= "dye"
  36. then
  37. return
  38. end
  39. if self.sail
  40. then
  41. self.sail_color = name[2]
  42. else
  43. self.flag_color = name[2]
  44. end
  45. set_colors(self)
  46. local name = clicker:get_player_name()
  47. if not (creative and creative.is_enabled_for
  48. and creative.is_enabled_for(name))
  49. then
  50. itemstack:take_item()
  51. clicker:set_wielded_item(itemstack)
  52. end
  53. return true
  54. end
  55. local function spawn_particles(self)
  56. if abs(self.speed) / random() < 9
  57. then
  58. return
  59. end
  60. local pos = self.object:get_pos()
  61. local yaw = -(self.object:get_yaw() + pi / 2)
  62. local left = {x = sin(yaw), y = 0, z = cos(yaw)}
  63. local back_left = vector.add(pos, left)
  64. local back_right = vector.add(pos, vector.multiply(left, -1.1))
  65. minetest.add_particle(
  66. {
  67. pos = back_left,
  68. texture = "bubble.png",
  69. size = random(5),
  70. expirationtime = random() * 3,
  71. })
  72. minetest.add_particle(
  73. {
  74. pos = back_right,
  75. texture = "bubble.png",
  76. size = random(5),
  77. expirationtime = random() * 3,
  78. })
  79. end
  80. local function angle(v1, v2)
  81. local doot = v1.x * v2.x + v1.y * v2.y + v1.z * v2.z
  82. local lengths = length(v1) * length(v2)
  83. return math.acos(doot / lengths)
  84. end
  85. --displays wind direction by rotating the flag
  86. local function show_wind(self)
  87. local yaw = self.object:get_yaw() + pi / 2
  88. local pos = self.object:get_pos()
  89. local wind = perlin_wind.get(pos)
  90. --blow flag
  91. local foreward = {x = cos(yaw), y = 0, z = sin(yaw)}
  92. local flag_yaw = angle(wind, {x = 0, y = 0, z = 1}) + yaw
  93. flag_yaw = (flag_yaw / pi * 180 + 180) % 360
  94. self.flag:set_attach(self.object,
  95. "",
  96. flag_attach,
  97. {x = 0, y = flag_yaw, z = 0})
  98. end
  99. return set_colors, dye, spawn_particles, show_wind