function onLoad() -- Set some default values for the dice behaviour lifespan = 3 spin_speed = 3 rise_speed = 3 grow_speed = 3 font_size = 3 flash_max = true sound_max = true sound_min = false log_chat = true parent_guid = "card01" roll_active = false --get the table of "rotational values", which can be set with the F8 Gizmo Tool rv = self.getRotationValues() or false end -- Have the onDrop and onRandomise functions trigger our effect function onDrop(c) trigger(c) end function onRandomize(c) trigger(c) end -- Trigger effect - this is the main function which is called when dropped or rolled function trigger(c) --it's possible to trigger the effect multiple times, before the dice stops rolling, so we check and then set a flag to prevent multiple triggers if roll_active then return false end roll_active = true --wait until the dice stops rolling before activating the trigger Wait.condition(function() --main body of the function to be run when the dice stops rolling --disable flag roll_active = false --get the value of the current rotation and assign is to var s local s = self.getRotationValue() or false --check we have a valid rotation value to report, if not we exit if not s or not rv then log("Dice "..self.guid.." does not have a valid rotation value set! Unable to show roll value.") return false end --get current position of dice local pos = self.getPosition() + Vector({0, 1+(font_size/5), 0}) --spawn a TextTool object local obj = spawnObject({ type = "3DText", position = pos, sound = true, }) --customise the textTool ovject with the relevant style/values obj.TextTool.setValue(tostring(s)) obj.TextTool.setFontColor(self.getColorTint()) obj.TextTool.setFontSize(font_size*24) --wait a single frame before continuing, to allow the TextTool object to spawn Wait.frames(function() --make it non-interactable obj.interactable = false obj.auto_raise = false --raise TextTool into the air (function is below) rise(obj, pos) --spin TextTool (function is below) spin(obj, {0,spin_speed*18,0}) --grow TextTool (or shrink, if given a negative value at the top) (function is below) grow(obj, font_size*24) --print value of s to log log("Score is "..s) --print to chat, if enabled if log_chat then local name = c if self.getName() and self.getName() ~= "" then name = name.." | "..self.getName() end printToAll("["..name.."] "..Player[c].steam_name.." rolled a "..s, c) end --if s is max value, trigger sound or flash if (sound_max or flash_max) and s==rv[#rv].value then --flash object, if enabled if flash_max then flash(self) flash(obj) end --play sound, if enabled and parent containing sound object is enabled if sound_max and getObjectFromGUID(parent_guid) then getObjectFromGUID(parent_guid).AssetBundle.playTriggerEffect(0) end end -- if s is min value, trigger fail sound if s == 1 and sound_min and getObjectFromGUID(parent_guid) then getObjectFromGUID(parent_guid).AssetBundle.playTriggerEffect(1) end --after the length of lifetime has passed, destroy the TextTool object Wait.time(function() obj.destruct() end, lifespan) end, 1) end, --condition to check for the wait function function() return self.resting end, --time to wait for the wait function 30, --function to call if wait time is exceeded function() log("Timeout exceeded waiting for dice to come to a stop") roll_active = false end) end -- below are various utility functions, used by the main function above. they are mostly self-explanatory function rise(obj, pos) if not getObjectFromGUID(obj.guid) then return false end obj.setPosition(pos) pos[2] = pos[2] + (rise_speed/100) Wait.frames(function() rise(obj, pos) end, 1) end function spin(obj, rot) if not getObjectFromGUID(obj.guid) then return false end obj.setRotationSmooth(rot, false, true) rot[2] = rot[2] + spin_speed*5 Wait.time(function() spin(obj, rot) end, 0.5) end function grow(obj, font_size) if not getObjectFromGUID(obj.guid) then return false end obj.TextTool.setFontSize(font_size) Wait.time(function() grow(obj, font_size*((grow_speed+100)/100)) end, 0.1) end function flash(obj, i) if not getObjectFromGUID(obj.guid) or (i and i > 20) then return false end local c = i or 1 local col = self.getColorTint() if c % 2 == 0 then col = randomColor() end if obj.tag == "3D Text" then obj.TextTool.setFontColor(col) else obj.highlightOn(col, 0.1) end Wait.time(function() flash(obj, c+1) end, 0.2) end function randomColor() local r = math.random return {r(255)/255, r(255)/255, r(255)/255} end