I’m trying to create a system that will spawn coins around a map.
I don’t have a lot of scripting knowledge, but I did think of something that might work. I could be able to create a part, and then use math.Random to choose random areas for coins to spawn on this part. I’m just not exactly sure what type of script I need to use, and what I would need specifically in it. If there is a more efficient way, feel free to tell me.
I’m trying to create a script that can differentiate rarity, and spawn coins according to this rarity hierarchy.
I have 6 coins, and I would like a bronze coin to spawn more often than a gold coin. I’m not exactly sure how to do this, but I know there are “tables” in lua.
I’m not asking for a script. I’m asking for what type of script is necessary, and what the basic fundamentals could be to create these functions. Thanks!
1. Have a dictionary with the rarity as the key and a table with all the coins in that rarity as the value.
2. Use math.random(1,10) to come up with a number, then…
3. Use an if statement to choose (Ex:
if randNum < 5 then
coinToSpawn = coinsDict['common'][math.random(1, #coinsDict['common'])]
)
In effect all this did was if its less than 5, then the coin to spawn is a common coin in the coin dictionary (coinDict). The math.random is to choose a random common coin (like if copper and bronze coin were both common). The hashtag (#) is to get how long the table of common coins are, so you dont have to change the second number every time you add something new.
Square Brackets ([]) are a way to access a certain index in a table.
This probably wasn’t very descriptive, I typed this up in 1 minute lol, I apologize for that.
I hope this helps though.
When making a chance system, I recommend you use some sort of module, I personally recommend using LootPlan. It’s pretty easy to use and works well.
local ReplicatedStorage = game:GetService("ReplicatedStorage");
local LootPlan = require(ReplicatedStorage.LootPlan); --Put the LootPlan module in ReplicatedStorage.
local coinLootPlan = LootPlan.new("single"); --This makes a new loot plan
coinLootPlan:AddLoot("coin", 50); --This makes a new loot called "coin" with a 50% chance of dropping
coinLootPlan:AddLoot("coin2", 25); --This makes a new loot called "coin2" with a 25% chance of dropping
coinLootPlan:AddLoot("coin3", 5); --This makes a new loot called "coin3" with a 5% chance of dropping
function spawnCoin()
local chosenCoin = coinLootPlan:GetRandomLoot(); --This will pick a random coin name from the loot pool we made above
print(chosenCoin); --Now you can do with this as you will
end
spawnCoin();
I was just showing an example of how to use the module I proposed. OP said he doesn’t know too much about programming, so I decided to write something to show how to use a module in case they didn’t know.
If you’re going to pull this card, you also didn’t say what type of script to use. You just said use a dictionary and a table.
Didn’t say anything about if that should just be a dictionary at the top of their script, or if it should be a module script.
All I’m trying to say, is we aren’t here to ridicule or attack others, and your reply doesn’t sound like the nicest reply when we’re trying to be in a helpful, constructive environment on the DevForum.
To do this, you will need a Randomizing skill. Let me take an example. Create a for loop for 6 Coins. Like this for Coin in 1, NumberOfCoins do. Then inside it you will give it a spawning script right? But you want it to have different type of coins that spawn rarer and one spawn more often ( here is gold coin and broze coin. ). Then you can do
local CoinRarity = {
["Brozen"] = 70, -- Have 70% to spawn
["Gold"] = 30 -- Have 30% to spawn
}
for Coin in 1, NumberOfCoins do
local RandomCoinType = RandomWithPercentage(CoinRarity) -- Give it the loot table
print(string.format("%s Coin has spawned!", RandomCoinType))
wait(5) -- Give it 5 seconds before another spawn
end
You can get the RandomWithPercentage function from the Forum. But the LootPlan make exploiters able to mess around with it. So I will give you my old function which works pretty well in my game.
function RandomWithPercentage(LootTable)
if LootTable then
local Total_Percentage = 0
for _, total_percent in pairs(LootTable) do
Total_Percentage += total_percent
end
if Total_Percentage == 100 then
local WeightedLootTable = {}
-- Get Multiplys
local WeightedMultiplys = 1
for _, percentage in pairs(LootTable) do
if percentage < 1 then
local TotalMultiplied = 0
for i = 0, 10 do
if percentage < 1 then
percentage *= 10
TotalMultiplied += 1
end
end
if TotalMultiplied > WeightedMultiplys then
WeightedMultiplys = TotalMultiplied
end
end
end
-- Multiplying WeightedTable
for item, percentage in pairs(LootTable) do
local WeightedPercentage = percentage
for i = 0, WeightedMultiplys do
WeightedPercentage *= 10
end
WeightedLootTable[item] = WeightedPercentage
end
-- Doing a Double Check
local Smallest_Percent = math.huge
for _, percentage in pairs(WeightedLootTable) do
if percentage < Smallest_Percent then
Smallest_Percent = percentage
end
end
if Smallest_Percent > 10 then
for item, percentage in pairs(WeightedLootTable) do
WeightedLootTable[item] = percentage / 10
end
end
-- Randomizing
local sum = 0
for k, v in pairs(WeightedLootTable) do
sum = sum + v
end
local r = math.random(sum)
for k, v in pairs(WeightedLootTable) do
r = r - v
if r <= 0 then
return k
end
end
end
else
warn("Randomizing requires a loot table!")
end
end
local CoinRarity = {
["Brozen"] = 70, -- Have 70% to spawn
["Gold"] = 30 -- Have 30% to spawn
}
local RandomCoinType = PercentageRandomizing(CoinRarity)
print(RandomCoinType)
This used Weighted Percentage, you can mess around with it and I’ve made this to work with decimal!
EDIT : MAKE SURE THE LOOT TABLE SUM IS 100, NOT GREATER OR SMALLER.
So, I’m gonna try your way first, if it doesn’t work out then I’ll try the others in the thread.
So, I assume that I would need some sort of folder, possibly in Rep Storage, then I need to put the coins in the folder. I would then need to get the script to find the folder, and clone the coins at random area and use this script as a loot table for them?
Edit: Sorry if I’m wrong, like I said, I’m just now trying to learn scripting.
You can just get the Random Coin Type like the Script I gave you. You will notice that it’s printing different type. If you change the percentage, it will spawn different. But make sure it add up to 100. To get the coins, you can do
local CoinStorage = -- Where you store the coins
local RandomCoinType = -- Use the random function I gave you
local CoinMeshes = CoinStorage:FindFirstChild(RandomCoinType.."Coin") -- If it give Gold rarity, then you should have a Coin meshes named ```GoldCoin```.
local ClonedCoin = CoinMeshes:Clone()
ClonedCoin.Position = Vector3.new(math.random(1, 100), 1, math.random(1, 100)) -- Spawn it in random position
ClonedCoin.Parent = workspace
Ok, so I have my folder in Rep Storage, and my coins inside. I have my script in workspace, and everything in it setup, but when I test it, I get this:
Yup! Sorry about this, I know it’s probably missing a lot of what you gave me and I know this might be annoying for you.
local CoinStorage = game.ReplicatedStorage.CoinFolder-- Where you store the coins
local RandomCoinType = function RandomWithPercentage(LootTable)-- Use the random function I gave you
local CoinMeshes = CoinStorage:FindFirstChild(RandomCoinType.."Coin") -- If it give Gold rarity, then you should have a Coin meshes named ```GoldCoin```.
local ClonedCoin = CoinMeshes:Clone()
ClonedCoin.Position = Vector3.new(math.random(1, 100), 1, math.random(1, 100)) -- Spawn it in random position
ClonedCoin.Parent = workspace
Can you please change to this? You will need to define the function first.
function RandomWithPercentage(LootTable)
if LootTable then
local Total_Percentage = 0
for _, total_percent in pairs(LootTable) do
Total_Percentage += total_percent
end
if Total_Percentage == 100 then
local WeightedLootTable = {}
-- Get Multiplys
local WeightedMultiplys = 1
for _, percentage in pairs(LootTable) do
if percentage < 1 then
local TotalMultiplied = 0
for i = 0, 10 do
if percentage < 1 then
percentage *= 10
TotalMultiplied += 1
end
end
if TotalMultiplied > WeightedMultiplys then
WeightedMultiplys = TotalMultiplied
end
end
end
-- Multiplying WeightedTable
for item, percentage in pairs(LootTable) do
local WeightedPercentage = percentage
for i = 0, WeightedMultiplys do
WeightedPercentage *= 10
end
WeightedLootTable[item] = WeightedPercentage
end
-- Doing a Double Check
local Smallest_Percent = math.huge
for _, percentage in pairs(WeightedLootTable) do
if percentage < Smallest_Percent then
Smallest_Percent = percentage
end
end
if Smallest_Percent > 10 then
for item, percentage in pairs(WeightedLootTable) do
WeightedLootTable[item] = percentage / 10
end
end
-- Randomizing
local sum = 0
for k, v in pairs(WeightedLootTable) do
sum = sum + v
end
local r = math.random(sum)
for k, v in pairs(WeightedLootTable) do
r = r - v
if r <= 0 then
return k
end
end
end
else
warn("Randomizing requires a loot table!")
end
end
local CoinRarity = {
["Brozen"] = 70, -- Have 70% to spawn
["Gold"] = 30 -- Have 30% to spawn
}
local CoinStorage = game.ReplicatedStorage.CoinFolder-- Where you store the coins
local RandomCoinType = RandomWithPercentage(CoinRarity)
local CoinMeshes = CoinStorage:FindFirstChild(RandomCoinType.."Coin") -- If it give Gold rarity, then you should have a Coin meshes named ```GoldCoin```.
local ClonedCoin = CoinMeshes:Clone()
ClonedCoin.Position = Vector3.new(math.random(1, 100), 1, math.random(1, 100)) -- Spawn it in random position
ClonedCoin.Parent = workspace