Results 1 to 4 of 4

Thread: Scripted Blackjack Example

  1. #1

    Wink Scripted Blackjack Example

    I recently released a scripted blackjack table.

    If anyone is looking for some pointers here's the code I used. It's in no means perfect especially considering I bought this game a 2 weeks ago and coming from garrys mod where I scripted for 4 years. But it offers incite into what you can do and how to go about it.

    It feature custom chips (I forget by who), chip converter, a deal button(only deals to those who place a bet), a blackjack checker, a button to clean the table, card counter, and functional automatic power ups.

    Code:
    local Hands = {
    	-- 1 is card area
    	-- 2 is power up
    	-- 3 is currency
    	-- 4 is counter
    	-- 5 is an power up bonus
    	['White'] = {
    		['1'] = '47d19c',
    		['2'] = 'a66157',
    		['3'] = 'd43b95',
    		['4'] = '7b820b',
    		['5'] = 0,
    	},
    	['Red'] = {
    		['1'] = 'c03005',
    		['2'] = 'efb15c',
    		['3'] = '856f67',
    		['4'] = '32b444',
    		['5'] = 0,
    	},
    	['Orange'] = {
    		['1'] = '7a9754',
    		['2'] = '6a9181',
    		['3'] = 'd0ba7d',
    		['4'] = 'c5896f',
    		['5'] = 0,
    	},
    	['Yellow'] = {
    		['1'] = 'e0925f',
    		['2'] = '08f4d5',
    		['3'] = '9bf0f1',
    		['4'] = 'a11841',
    		['5'] = 0,
    	},
    	['Green'] = {
    		['1'] = '861fbb',
    		['2'] = '91f462',
    		['3'] = 'fdaeed',
    		['4'] = '400e1b',
    		['5'] = 0,
    	},
    	['Blue'] = {
    		['1'] = 'b00ab7',
    		['2'] = 'ce1e35',
    		['3'] = '80280c',
    		['4'] = 'e322fc',
    		['5'] = 0,
    	},
    	['Purple'] = {
    		['1'] = '2e731d',
    		['2'] = '5d2feb',
    		['3'] = '01ac2b',
    		['4'] = '04338e',
    		['5'] = 0,
    	},
    	['Pink'] = {
    		['1'] = '02ccea',
    		['2'] = 'a43b96',
    		['3'] = '5ce2b3',
    		['4'] = '6028b2',
    		['5'] = 0,
    	},
    }
    
    local Chips = {
    	-- Name = Number, Amount Up, Amount Down, GUID
    	['$1'] = { ['1'] = 1, ['2'] = 5, ['3'] = 0, ['4'] = "1f6e09" },
    	['$5'] = { ['1'] = 5, ['2'] = 2, ['3'] = 5, ['4'] = "482941" },
    	['$10'] = { ['1'] = 10, ['2'] = 5, ['3'] = 2, ['4'] = "291225" },
    	['$25'] = { ['1'] = 25, ['2'] = 2, ['3'] = 5, ['4'] = "23fd4f" },
    	['$50'] = { ['1'] = 50, ['2'] = 2, ['3'] = 2, ['4'] = "81fbcb" },
    	['$100'] = { ['1'] = 100, ['2'] = 5, ['3'] = 2, ['4'] = "a2c928" },
    	['$250'] = { ['1'] = 250, ['2'] = 2, ['3'] = 5, ['4'] = "928314" },
    	['$500'] = { ['1'] = 500, ['2'] = 2, ['3'] = 5, ['4'] = "a8a4cf" },
    	['$1000'] = { ['1'] = 1000, ['2'] = 5, ['3'] = 2, ['4'] = "38a247" },
    	['$2500'] = { ['1'] = 2500, ['2'] = 2, ['3'] = 5, ['4'] = "6b0365" },
    	['$5000'] = { ['1'] = 5000, ['2'] = 2, ['3'] = 5, ['4'] = "d40713" },
    	['$10000'] = { ['1'] = 10000, ['2'] = 5, ['3'] = 2, ['4'] = "cadde9" },
    	['$25000'] = { ['1'] = 25000, ['2'] = 2, ['3'] = 5, ['4'] = "0c5bd3" },
    	['$50000'] = { ['1'] = 50000, ['2'] = 2, ['3'] = 5, ['4'] = "a8af60" },
    	['$100000'] = { ['1'] = 100000, ['2'] = 0, ['3'] = 2, ['4'] = "d1dd8f" },
    }
    
    Deck = {}
    Deck_guid = ""
    Deck_counter = '7ce289'
    Dealer_bust = false
    Dealer_pu = 0
    
    function IsCard( obj )
    	if not obj.name == 'Card' then return false end
    		if obj.getName() == '1' or obj.getName() == '2' or obj.getName() == '3' or obj.getName() == '4' or obj.getName() == '5' or obj.getName() == '6' or obj.getName() == '7' or obj.getName() == '8' or obj.getName() == '9' or obj.getName() == '10' or obj.getName() == 'One' or obj.getName() == 'Two' or obj.getName() == 'Three' or obj.getName() == 'Four' or obj.getName() == 'Five' or obj.getName() == 'Six' or obj.getName() == 'Seven' or obj.getName() == 'Eight' or obj.getName() == 'Nine' or obj.getName() == 'Ten' or obj.getName() == 'Jack' or obj.getName() == 'Queen' or obj.getName() == 'King' or obj.getName() == 'Ace' then return true end
    	return false
    end
    
    function GetCards( guid )
    	local tbl, tbl2 =  getObjectFromGUID(guid).getObjects(), {}
    	
    	for k, v in pairs(tbl) do
    		if IsCard(v) then
    			tbl2[#tbl2 + 1] = v
    		end
    	end
    	
    	return tbl2
    end
    
    function IsPowerUp( obj )
    	if not obj.name == 'CustomModel' then return false end
    	if obj.getName() == 'Goomba' or obj.getName() == 'Mushroom' or obj.getName() == '1-Up' or obj.getName() == 'Yoshi Egg' or obj.getName() == 'Fire Flower' or obj.getName() == 'Robert-Omb' or obj.getName() == 'Boo' or obj.getName() == 'Chain Chomp' or obj.getName() == '? Block' or obj.getName() == 'Star' or obj.getName() == 'Gold Coin' or obj.getName() == 'Brick Block' or obj.getName() == 'Metal Block' then return true end
    	return false
    end
    
    function IsChips( obj )
    	if not obj.name == 'CustomModel' then return false end
    	if obj.getName() == '$1' or obj.getName() == '$5' or obj.getName() == '$10' or obj.getName() == '$25' or obj.getName() == '$50' or obj.getName() == '$100' or obj.getName() == '$250' or obj.getName() == '$500' or obj.getName() == '$1000' or obj.getName() == '$2500' or obj.getName() == '$5000' or obj.getName() == '$10000' or obj.getName() == '$25000' or obj.getName() == '$50000' or obj.getName() == '$100000' then return true end
    	return false
    end
    
    function GetCardValve( obj )
    	if not IsCard(obj) then return end
    	
    	if obj.getName() == 'One' then
    		return 1
    	end
    	if obj.getName() == 'Two' then
    		return 2
    	end
    	if obj.getName() == 'Three' then
    		return 3
    	end
    	if obj.getName() == 'Four' then
    		return 4
    	end
    	if obj.getName() == 'Five' then
    		return 5
    	end
    	if obj.getName() == 'Six' then
    		return 6
    	end
    	if obj.getName() == 'Seven' then
    		return 7
    	end
    	if obj.getName() == 'Eight' then
    		return 8
    	end
    	if obj.getName() == 'Nine' then
    		return 9
    	end
    	if obj.getName() == 'Ten' then
    		return 10
    	end
    	
    	if obj.getName() == '1' then
    		return 1
    	end
    	if obj.getName() == '2' then
    		return 2
    	end
    	if obj.getName() == '3' then
    		return 3
    	end
    	if obj.getName() == '4' then
    		return 4
    	end
    	if obj.getName() == '5' then
    		return 5
    	end
    	if obj.getName() == '6' then
    		return 6
    	end
    	if obj.getName() == '7' then
    		return 7
    	end
    	if obj.getName() == '8' then
    		return 8
    	end
    	if obj.getName() == '9' then
    		return 9
    	end
    	if obj.getName() == '10' then
    		return 10
    	end
    	
    	if obj.getName() == 'Jack' then
    		return 10
    	end
    	
    	if obj.getName() == 'Queen' then
    		return 10
    	end
    	
    	if obj.getName() == 'King' then
    		return 10
    	end
    	
    	if obj.getName() == 'Ace' then
    		return 11
    	end
    	
    	return 0
    end
    
    function DoPowerUp( obj, ply )
    	if not obj.name == 'CustomModel' then return end
    	
    	if obj.getName() == 'Goomba' then
    		local cpos, dpos = getObjectFromGUID(Hands[ply]['1']).getPosition(), getObjectFromGUID('ca1f69').getPosition()
    		
    		for k, v in pairs(getObjectFromGUID('ca1f69').getObjects()) do
    			if IsCard(v) then
    				v.setPositionSmooth(cpos)
    			end
    		end
    		
    		for k, v in pairs(getObjectFromGUID(Hands[ply]['1']).getObjects()) do
    			if IsCard(v) then
    				v.setPositionSmooth(dpos)
    			end
    		end
    		
    		broadcastToAll(Player[ply].steam_name .. " used " .. obj.getName() .. " power up.\n" .. obj.getDescription(), {0.25, 1.0, 0.5} )
    	end
    	
    	if obj.getName() == 'Mushroom' then
    		Hands[ply]['5'] = Hands[ply]['5'] + 10
    		
    		broadcastToAll(Player[ply].steam_name .. " used " .. obj.getName() .. " power up.\n" .. obj.getDescription(), {0.25, 1.0, 0.5} )
    	end
    	
    	if obj.getName() == '1-Up' then
    		Hands[ply]['5'] = Hands[ply]['5'] + 1
    		
    		broadcastToAll(Player[ply].steam_name .. " used " .. obj.getName() .. " power up.\n" .. obj.getDescription(), {0.25, 1.0, 0.5} )
    	end
    	
    	if obj.getName() == 'Yoshi Egg' then
    		for k, v in pairs(getObjectFromGUID('ca1f69').getObjects()) do
    			if IsCard(v) then
    				destroyObject(v)
    			end
    		end
    		
    		local params = {}
    		params.position = getObjectFromGUID('ca1f69').getPosition()
    		params.rotation = {0, 0, 0}
    		params.top = true
    		
    		Deck.takeObject(params)
    		
    		local params2 = {}
    		params2.position = getObjectFromGUID('aa904f').getPosition()
    		params2.rotation = {0, 0, Deck.getRotation().z}
    		params2.top = true
    		
    		Deck.takeObject(params2)
    		
    		broadcastToAll(Player[ply].steam_name .. " used " .. obj.getName() .. " power up.\n" .. obj.getDescription(), {0.25, 1.0, 0.5} )
    	end
    	
    	if obj.getName() == 'Fire Flower' then
    		Dealer_pu = Dealer_pu + -3
    		
    		broadcastToAll(Player[ply].steam_name .. " used " .. obj.getName() .. " power up.\n" .. obj.getDescription(), {0.25, 1.0, 0.5} )
    	end
    	
    	if obj.getName() == 'Robert-Omb' then
    		Dealer_bust = true
    		
    		broadcastToAll(Player[ply].steam_name .. " used " .. obj.getName() .. " power up.\n" .. obj.getDescription(), {0.25, 1.0, 0.5} )
    	end
    	
    	if obj.getName() == 'Boo' then
    		local zone = getObjectFromGUID('aa904f')
    		for k, v in pairs(zone.getObjects()) do
    			if IsCard(v) then
    				v.flip()
    			end
    		end
    		
    		broadcastToAll(Player[ply].steam_name .. " used " .. obj.getName() .. " power up.\n" .. obj.getDescription(), {0.25, 1.0, 0.5} )
    	end
    	
    	if obj.getName() == 'Chain Chomp' then
    		local zone = getObjectFromGUID(Hands[ply]['1'])
    		for k, v in pairs(zone.getObjects()) do
    			if IsCard(v) then
    				destroyObject(v)
    			end
    		end
    		
    		local v = Hands[ply]['1']
    		
    		local pos = getObjectFromGUID(v).getPosition()
    		pos.x = pos.x + 1
    		local pos2 = { pos.x - 1, pos.y, pos.z }
    		
    		local params = {}
    		params.position = pos
    		params.rotation = {0, 0, Deck.getRotation().z - 180}
    		params.flip = true
    		params.top = true
    		
    		Deck.takeObject(params)
    		
    		params.position = pos2
    		params.rotation = {0, 0, Deck.getRotation().z - 180}
    		
    		Deck.takeObject(params)
    		
    		broadcastToAll(Player[ply].steam_name .. " used " .. obj.getName() .. " power up.\n" .. obj.getDescription(), {0.25, 1.0, 0.5} )
    	end
    	
    	if obj.getName() == '? Block' then
    		local chest = getObjectFromGUID('2dfdf8')
    		chest.shuffle()
    		
    		
    		local params = {}
    		params.position = getObjectFromGUID(Hands[ply]['1']).getPosition()
    		params.rotation = {0, 0, Deck.getRotation().z - 180}
    		params.top = true
    		
    		chest.takeObject(params)
    		
    		broadcastToAll(Player[ply].steam_name .. " used " .. obj.getName() .. " power up.\n" .. obj.getDescription(), {0.25, 1.0, 0.5})
    	end
    	
    	if obj.getName() == 'Star' then
    		broadcastToAll(Player[ply].steam_name .. " used " .. obj.getName() .. " power up.\n" .. obj.getDescription(), {0.25, 1.0, 0.5})
    		return -- can't go bust
    	end
    	
    	if obj.getName() == 'Gold Coin' then
    		broadcastToAll(Player[ply].steam_name .. " used " .. obj.getName() .. " power up.\n" .. obj.getDescription(), {0.25, 1.0, 0.5})
    		return -- everyone wins
    	end
    	
    	if obj.getName() == 'Brick Block' then
    		local zone = getObjectFromGUID(Hands[ply]['1'])
    		for k, v in pairs(zone.getObjects()) do
    			if IsCard(v) then
    				destroyObject(v)
    			end
    		end
    		
    		broadcastToAll(Player[ply].steam_name .. " used " .. obj.getName() .. " power up.\n" .. obj.getDescription(), {0.25, 1.0, 0.5} )
    	end
    	
    	if obj.getName() == 'Metal Block' then
    		return -- does nothing
    	end
    	
    	destroyObject(obj)
    	
    	local count = 0 + Dealer_pu
    	for k, v in pairs(getObjectFromGUID('ca1f69').getObjects()) do
    		if IsCard(v) then
    			if v.getRotation().z > 180 then
    				count = count + GetCardValve(v)
    			end
    		end
    	end
    	
    	if count > 0 then
    		getObjectFromGUID(Deck_counter).TextTool.setValue(tostring(count))
    	end
    	
    	for ply, val in pairs(Hands) do
    		local zone = getObjectFromGUID(val['1'])
    		local count2 = 0
    		
    		for k, v in pairs(zone.getObjects()) do
    			if IsCard(v) then
    				count2 = count2 + GetCardValve(v)
    			end
    		end
    		
    		if val['5'] > 0 then
    			count2 = count2 + val['5']
    		end
    		
    		if count2 > 0 then
    			getObjectFromGUID(val['4']).TextTool.setValue(tostring(count2))
    		end
    	end
    	
    	return
    end
    
    function DoDeal(obj, ply)
    	if not Player[ply].admin then
    		broadcastToColor("Your not an admin.", ply, {0.25, 1.0, 0.5} )
    		return
    	end
    	
    	if Deck_guid == "" then
    		broadcastToAll("Missing deck or Deck not compatible.", {0.25, 1.0, 0.5} )
    		return
    	end
    	
    	for ply, val in pairs(Hands) do
    		Hands[ply]['5'] = 0
    	end
    	
    	for _, ply in pairs(getSeatedPlayers()) do
    		if #getObjectFromGUID(Hands[ply]['3']).getObjects() >= 2 then
    			local pos = getObjectFromGUID(Hands[ply]['1']).getPosition()
    			pos.x = pos.x + 1
    			local pos2 = { pos.x - 1, pos.y, pos.z }
    			
    			local params = {}
    			params.position = pos
    			params.rotation = {0, 0, Deck.getRotation().z - 180}
    			params.flip = true
    			params.top = true
    			
    			Deck.takeObject(params)
    			
    			params.position = pos2
    			params.rotation = {0, 0, Deck.getRotation().z - 180}
    			
    			Deck.takeObject(params)
    		else
    			broadcastToColor("Skipping cards this round.\nTry betting before cards are delt.", ply, {0.25, 1.0, 0.5})
    		end
    	end
    	
    	local params = {}
    	params.position = getObjectFromGUID('3ebf0f').getPosition()
    	params.rotation = {0, 0, 0}
    	params.top = true
    	
    	Deck.takeObject(params)
    	
    	local params2 = {}
    	params2.position = getObjectFromGUID('aa904f').getPosition()
    	params2.rotation = {0, 0, Deck.getRotation().z}
    	params2.top = true
    	
    	Deck.takeObject(params2)
    end
    
    function DoClean(obj, ply)
    	if not Player[ply].admin then
    			broadcastToColor("Your not an admin.", ply, {0.25, 1.0, 0.5} )
    		return
    	end
    	
    	Dealer_bust = false
    	Dealer_pu = 0
    	
    	for ply, val in pairs(Hands) do
    		local zone = getObjectFromGUID(val['1'])
    		for k, v in pairs(zone.getObjects()) do
    			if IsCard(v) then
    				destroyObject(v)
    			end
    		end
    		
    		local zone2 = getObjectFromGUID(val['2'])
    		for k, v in pairs(zone2.getObjects()) do
    			if IsPowerUp(v) then
    				destroyObject(v)
    			end
    		end
    		
    		Hands[ply]['5'] = 0
    	end
    	
    	for k, v in pairs(getObjectFromGUID('3ebf0f').getObjects()) do
    		if IsCard(v) then
    			destroyObject(v)
    		end
    	end
    	
    	for k, v in pairs(getObjectFromGUID('aa904f').getObjects()) do
    		if IsCard(v) then
    			destroyObject(v)
    		end
    	end
    	
    	for k, v in pairs(getObjectFromGUID('ca1f69').getObjects()) do
    		if IsCard(v) then
    			destroyObject(v)
    		end
    	end
    	
    	getObjectFromGUID(Deck_counter).TextTool.setFontColor({1.0, 1.0, 1.0})
    	getObjectFromGUID(Deck_counter).TextTool.setValue("0")
    	
    	for color, val in pairs(Hands) do
    		getObjectFromGUID(val['4']).TextTool.setFontColor({1.0, 1.0, 1.0})
    		getObjectFromGUID(val['4']).TextTool.setValue("0")
    	end
    end
    
    function DoBJC(obj, ply)
    	if not Player[ply].admin then
    			broadcastToColor("Your not an admin.", ply, {0.25, 1.0, 0.5} )
    		return
    	end
    	
    	local card1, card2 = 0, 0
    	for k, v in pairs(getObjectFromGUID('3ebf0f').getObjects()) do
    		if IsCard(v) then
    			card1 = GetCardValve(v)
    		end
    	end
    	
    	for k, v in pairs(getObjectFromGUID('aa904f').getObjects()) do
    		if IsCard(v) then
    			card2 = GetCardValve(v)
    		end
    	end
    	
    	if card1 > 9 then
    		if card1 + card2 == 21 then
    			broadcastToAll("The dealer has blackjack.", {0.25, 1.0, 0.5} )
    			
    			for k, v in pairs(getObjectFromGUID('aa904f').getObjects()) do
    				if IsCard(v) then
    					v.flip()
    				end
    			end
    		else
    			broadcastToAll("The dealer doesn't blackjack.", {0.25, 1.0, 0.5} )
    		end
    	end
    end
    
    function DoSpawnChips( num, guid )
    	local pos = getObjectFromGUID('7b3ae8').getPosition()
    	for i = 1, num do
    		getObjectFromGUID(guid).takeObject({position = { pos.x, pos.y + (i * 0.5), pos.z}})
    	end
    end
    
    function DoSpawnChips2( num, guid )
    	local pos = getObjectFromGUID('6e1631').getPosition()
    	for i = 1, num do
    		getObjectFromGUID(guid).takeObject({position = { pos.x, pos.y + (i * 0.5), pos.z}})
    	end
    end
    
    function DoChipsDown()
    	for k, v in pairs(getObjectFromGUID('7b3ae8').getObjects()) do
    		if IsChips(v) then
    			local amount = 0
    			local num, val, req = math.abs(v.getQuantity()), Chips[v.getName()]['1'] or 0, Chips[v.getName()]['3'] or 0
    			
    			if Chips[v.getName()]['3'] > 0 then
    				amount = num * req
    				num = val / req
    				
    				DoSpawnChips(amount, Chips[tostring('$' .. num)]['4'])
    				destroyObject(v)
    			end
    		end
    	end
    end
    
    function DoChipsDown2()
    	for k, v in pairs(getObjectFromGUID('6e1631').getObjects()) do
    		if IsChips(v) then
    			local amount = 0
    			local num, val, req = math.abs(v.getQuantity()), Chips[v.getName()]['1'] or 0, Chips[v.getName()]['3'] or 0
    			
    			if Chips[v.getName()]['3'] > 0 then
    				amount = num * req
    				num = val / req
    				
    				DoSpawnChips2(amount, Chips[tostring('$' .. num)]['4'])
    				destroyObject(v)
    			end
    		end
    	end
    end
    
    function DoChipsUp()
    	local tbl = {}
    	for k, v in pairs(getObjectFromGUID('7b3ae8').getObjects()) do
    		if IsChips(v) then
    			local num, val = math.abs(v.getQuantity()), Chips[v.getName()]['1']
    			
    			if not tbl[val] then tbl[val] = 0 end
    			
    			tbl[val] = tbl[val] + num
    			destroyObject(v)
    		end
    	end
    	
    	for k, v in pairs(tbl) do
    		local str = tostring('$' .. k)
    		local req =  Chips[str]['2']
    		local nex =  k * req
    		local num = 0
    		if v > 0 then
    			if req > 0 then
    				if v >= req then
    					for i =1, v do
    						num = num + 1
    						
    						if num == req then
    							v = v - num
    							DoSpawnChips(1, Chips[tostring('$' .. nex)]['4'])
    							num = 0
    						end
    					end
    				end
    				
    				if v < req then
    					DoSpawnChips(v, Chips[str]['4'])
    					
    					v = 0
    				end
    			else
    				DoSpawnChips(v, Chips[str]['4'])
    				v = 0
    			end
    		end
    	end
    end
    
    function DoChipsUp2()
    	local tbl = {}
    	for k, v in pairs(getObjectFromGUID('6e1631').getObjects()) do
    		if IsChips(v) then
    			local num, val = math.abs(v.getQuantity()), Chips[v.getName()]['1']
    			
    			if not tbl[val] then tbl[val] = 0 end
    			
    			tbl[val] = tbl[val] + num
    			destroyObject(v)
    		end
    	end
    	
    	for k, v in pairs(tbl) do
    		local str = tostring('$' .. k)
    		local req =  Chips[str]['2']
    		local nex =  k * req
    		local num = 0
    		if v > 0 then
    			if req > 0 then
    				if v >= req then
    					for i =1, v do
    						num = num + 1
    						
    						if num == req then
    							v = v - num
    							DoSpawnChips2(1, Chips[tostring('$' .. nex)]['4'])
    							num = 0
    						end
    					end
    				end
    				
    				if v < req then
    					DoSpawnChips2(v, Chips[str]['4'])
    					
    					v = 0
    				end
    			else
    				DoSpawnChips2(v, Chips[str]['4'])
    				v = 0
    			end
    		end
    	end
    end
    
    function onLoad()
    	local tbl = getObjectFromGUID("c6af75")
    	
    	tbl.createButton({
    		click_function='DoDeal', label='Deal',
    		position={14, 0.5, -8}, rotation={0,-0,0}, width=600, height=420, font_size=140
    	})
    	
    	tbl.createButton({
    		click_function='DoClean', label='Clean',
    		position={16, 0.5, -8}, rotation={0,-0,0}, width=600, height=420, font_size=140
    	})
    	
    	tbl.createButton({
    		click_function='DoBJC', label='Check',
    		position={12, 0.5, -8}, rotation={0,-0,0}, width=600, height=420, font_size=140
    	})
    	
    	tbl.createButton({
    		click_function='DoChipsDown', label='Down',
    		position={10, 0.5, -5}, rotation={0,-0,0}, width=600, height=420, font_size=140
    	})
    	
    	tbl.createButton({
    		click_function='DoChipsUp', label='Up',
    		position={10, 0.5, -6}, rotation={0,-0,0}, width=600, height=420, font_size=140
    	})
    	
    	tbl.createButton({
    		click_function='DoChipsDown2', label='Down',
    		position={-10, 0.5, -5}, rotation={0,-0,0}, width=600, height=420, font_size=140
    	})
    	
    	tbl.createButton({
    		click_function='DoChipsUp2', label='Up',
    		position={-10, 0.5, -6}, rotation={0,-0,0}, width=600, height=420, font_size=140
    	})
    	
    	for k, v in pairs(getObjectFromGUID('750159').getObjects()) do
    		if v.name == 'Deck' and v.guid != "" and v.getQuantity() > 51 then
    			Deck = getObjectFromGUID(v.guid)
    			Deck_guid = v.guid
    			
    			return
    		end
    	end
    end
    
    function update()
    	local count = 0 + Dealer_pu
    	
    	for k, v in pairs(getObjectFromGUID('ca1f69').getObjects()) do
    		if IsCard(v) then
    			if v.getRotation().z > 180 then
    				local card = GetCardValve(v)
    				
    				if card == 11 then
    					if count > 21 or #GetCards('ca1f69') > 2 then
    						count = count + 1
    					else
    						count = count + card
    					end
    				else
    					count = count + card
    				end
    			end
    		end
    	end
    	
    	getObjectFromGUID(Deck_counter).TextTool.setFontColor({1.0, 1.0, 1.0})
    	
    	if count > 0 then
    		if count == 21 then
    			if #GetCards('ca1f69') > 2 then
    				getObjectFromGUID(Deck_counter).TextTool.setFontColor({0.0, 0.5, 0.0})
    			else
    				getObjectFromGUID(Deck_counter).TextTool.setFontColor({0.0, 1.0, 0.0})
    			end
    		end
    		
    		if count > 21 then
    			getObjectFromGUID(Deck_counter).TextTool.setFontColor({1.0, 1.0, 0.0})
    		end
    		
    		getObjectFromGUID(Deck_counter).TextTool.setValue(tostring(count))
    	else
    		if not tostring(count) == getObjectFromGUID(Deck_counter).TextTool.getValue() then
    			getObjectFromGUID(Deck_counter).TextTool.setValue(tostring(count))
    		end
    	end
    	
    	if Dealer_bust then
    		getObjectFromGUID(Deck_counter).TextTool.setFontColor({1.0, 1.0, 0.0})
    		getObjectFromGUID(Deck_counter).TextTool.setValue('Busted')
    	end
    	
    	for ply, val in pairs(Hands) do
    		local zone = getObjectFromGUID(val['1'])
    		local zone2 = getObjectFromGUID(val['2'])
    		local count2 = 0
    		
    		for k, v in pairs(zone.getObjects()) do
    			if IsCard(v) then
    				local card = GetCardValve(v)
    				
    				if card == 11 then
    					if count2 + card >= 21 or count2 >= 21 then
    						count2 = count2 + 1
    					else
    						count2 = count2 + card
    					end
    				else
    					count2 = count2 + card
    				end
    			end
    		end
    		
    		if val['5'] > 0 then
    			count2 = count2 + val['5']
    		end
    		
    		getObjectFromGUID(val['4']).TextTool.setFontColor({1.0, 1.0, 1.0})
    		
    		if count2 > 0 then
    			if count2 == 21 then
    				if #GetCards(val['1']) > 2 then
    					getObjectFromGUID(val['4']).TextTool.setFontColor({0.0, 0.5, 0.0})
    				else
    					getObjectFromGUID(val['4']).TextTool.setFontColor({0.0, 1.0, 0.0})
    				end
    			end
    			
    			if count2 > 21 then
    				getObjectFromGUID(val['4']).TextTool.setFontColor({1.0, 1.0, 0.0})
    			end
    		end
    		
    		for k, v in pairs(zone2.getObjects()) do
    			if IsPowerUp(v) then
    				DoPowerUp(v, ply)
    			end
    		end
    		
    		getObjectFromGUID(val['4']).TextTool.setValue(tostring(count2))
    	end
    	
    	local powerup = getObjectFromGUID('ad574f')
    	local time = getObjectFromGUID("680ff8")
    	local objects = { "9ae67d", "bcd805", "f53646", "c6814d", "f0e12f", "4b1747", "1b440d", "4ac4b1", "031b4c", "32b566", "bb2c45", "3191aa", "1f186a" }
    	
    	if time.getValue() < 1 then
    		for _, ply in pairs(getSeatedPlayers()) do
    			local obj = getObjectFromGUID(objects[math.random(1,13)])
    			local pos = getObjectFromGUID(Hands[ply]['1']).getPosition()
    			local params = {}
    			params.position = {pos.x, pos.y, pos.z + 5}
    			params.rotation = {0, 0, 0}
    			params.lock = false
    			
    			obj.unlock()
    			obj.clone(params)
    			obj.lock()
    		end
    		
    		time.setValue(900)
    		time.Clock.pauseStart()
    	end
    end
    
    function onObjectDestroyed()
    	for _, ply in pairs(getSeatedPlayers()) do
    		getObjectFromGUID(Hands[ply]['4']).TextTool.setValue('0')
    	end
    	
    	getObjectFromGUID(Deck_counter).TextTool.setValue('0')
    	
    	if Dealer_bust then
    		getObjectFromGUID(Deck_counter).TextTool.setValue('Busted')
    	end
    end
    
    function onObjectExitScriptingZone(zone, obj)
    	local count = 0 + Dealer_pu
    	for k, v in pairs(getObjectFromGUID('ca1f69').getObjects()) do
    		if IsCard(v) then
    			if v.getRotation().z > 180 then
    				local card = GetCardValve(v)
    				
    				if card == 11 then
    					if count > 21 or #GetCards('ca1f69') > 2 then
    						count = count + 1
    					else
    						count = count + card
    					end
    				else
    					count = count + card
    				end
    			end
    		end
    	end
    	
    	if count > 0 then
    		getObjectFromGUID(Deck_counter).TextTool.setValue(tostring(count))
    	end
    	
    	if Dealer_bust then
    		getObjectFromGUID(Deck_counter).TextTool.setValue('Busted')
    	end
    	
    	for ply, val in pairs(Hands) do
    		local zone = getObjectFromGUID(val['1'])
    		local count2 = 0
    		
    		for k, v in pairs(zone.getObjects()) do
    			if IsCard(v) then
    				local card = GetCardValve(v)
    				
    				if card == 11 then
    					if count2 + card >= 21 or count2 >= 21 then
    						count2 = count2 + 1
    					else
    						count2 = count2 + card
    					end
    				else
    					count2 = count2 + card
    				end
    			end
    		end
    		
    		if val['5'] > 0 then
    			count2 = count2 + val['5']
    		end
    		
    		if count2 > 0 then
    			getObjectFromGUID(val['4']).TextTool.setValue(tostring(count2))
    		end
    	end
    end
    
    function onObjectEnterScriptingZone(zone, obj)
    	if zone.guid == '750159' then
    		if obj.name == 'Deck' and obj.guid != "" and obj.getQuantity() > 51 then
    			Deck = getObjectFromGUID(obj.guid)
    			Deck_guid = obj.guid
    			obj.shuffle()
    			
    			broadcastToAll("Deck was shuffled!", {0.25, 1.0, 0.5} )
    			
    			return
    		end
    	end
    end
    You can find it on the workshop [url=http://steamcommunity.com/sharedfiles/filedetails/?id=774292858]here[/url].



    Code by Me
    Orignal table by Faustin & Exonic

  2. #2
    Join Date
    Sep 2016
    Posts
    219
    Having only glanced at the code, I noticed you have a lot of stuff in your update() method. Can you explain why you felt you needed it? TTS lacks a lot of useful events, I feel, but I still rarely find cases where it's absolutely necessary to do something every frame.

  3. #3
    Updating counters. In garry's mod obviously I would use Think function. I didn't want to use timers here. However all that aside I didn't notice any frame rate drops.

  4. #4
    Join Date
    Sep 2016
    Posts
    219
    Just tried it out. Looks nice! The CPU hit doesn't seem to be quite as bad as I would suspect it to be, given that you are doing for loops on large groups of objects every frame. My CPU goes up about 6-7% when your scripts are on, which isn't the worst thing in the world. Still, for the sake of using this as example code for others, I would see if there isn't a way to limit these updates, if at all possible. The best way would be in reaction to something the user does, such as dropping an object (using the onDropped function), rather than each frame. If that's not possible (and as I said above, TTS lacks a lot of useful events so it may very well be), consider checking the system time at the beginning of onUpdate() and only doing an update every x milliseconds, rather than each frame.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •