No, I do not, as I am a solo developer.
Oh, alright! Will you make it a model so people can use it?
Probably not because it requires you to have a discord server, express server, a database, Lua scripts, and a bunch of requirements. And I also don’t really like my things open-sourced, but I’m sure somebody will release something just like this someday!
Alrighty! May you add me on Discord? So we can chat more off-forum. spec!#1436
dude this is so cool i have never seen like that in my life
may be you can make a game in roblox which can be played on discord using commands like u use for dankmemer
I mean it would be possible but the problem is every packet would be sent every like 450 requests per minute aka 1 request every 0.125 seconds. Meaning that the average player would have a ping of 150. And some people in Roblox have pings of like 220 so that means pings of 250 for bad connections. I mean it would be playable but competitive wouldn’t be so good.
That’s a pretty solid system then.
As for getting the area around the player what I do is I turn the area around the player into text like a basic part saver. I use palls to retrieve all the properties and this is then combined, this text can then loaded. Saving this way is very quick which means I could even take multiple captures over the course of a few seconds to basically spectate the player from another server. This isn’t exactly compatible with discord though, you could save and retrieve the data from discord but you would have to be in game to load all the parts.
You are using webhooks so if the players account is linked to their discord account in the database you can call the players name and have the bot respond. You can then react with emojis and the bot can detect that.
Every player who is banned or has a rank is in the database. If you ban a user not in database, it checks if that user exists in Roblox first then it creates a new file in the database for that user. Did you create a custom image format for your capturing feature?
No, rather than taking a litteral picture it turns everything into text.
For example
PartType:Property1:Property2
Its a very common method, most check the part type then get each property but that means doing over 255 if statements along with a bunch of other stuff. Instead I just take the the part type and then check its properties as this saves a lot of lines, it makes no real difference performance wise.
The data could be sent to discord but without robloxs workspace it would be problematic to actually view. Im not saying its impossible to view it in discord but I will say it wouldnt be worth the time it would consume not to mention most likely another third party would be used to turn the text into a usable image.
Ah okay. Also I think converting to discord would require you to turn it into a JSON table and do a lot of crazy stuff on the backend.
It would be worth doing it for in game, the amount of exploiters and glitch abusers I’ve caught with it is insane. It is a bit of a lengthily script but I can see if I’ve still got the auto writing thing I made to write over 2k lines in about 30 seconds.
My Repeat Writing Thing To Make Part Save/Load
-- ScriptingHelper
List = {
"Adornee",
"AlwaysOnTop",
"Anchored",
"AnchorPoint",
"Angle",
"AngularActuatorType",
"AngularLimitsEnabled",
"AngularVelocity",
"AnimationId",
"ApplyAtCenterOfMass",
"Archivable",
"Attachment0",
"Attachment1",
"AttachmentFoward",
"AttachmentPos",
"AttachmentUp",
"Orientation",
"PlayOnRemove",
"Force",
"InFocusRadius",
"LayoutOrder",
"HeadColor",
"HeadColor3",
"AutoAssignable",
"AutoButtonColor",
"AutoJumpEnabled",
"AutoLocalize",
"AutoRotate",
"Axes",
"BackgroundColor3",
"BackgroundTransparency",
"BaseTextureId",
"BehaviourType",
"BlastPressure",
"BlastRadius",
"BodyPart",
"BorderColor3",
"BorderMode",
"BorderSizePixel",
"BottomImage",
"BreakJointsOnDeath",
"BrickColor",
"Brightness",
"CameraOffset",
"CanBeDropped",
"CanCollide",
"CanvasPosition",
"CanvasSize",
"CartoonFactor",
"CastShadow",
"CelestialBodiesShown",
"ClearTextOnFocus",
"ClipsDescendants",
"Coils",
"Color3",
"CoilsCollisionFidelity",
"Color",
"Contrast",
"ConversationDistance",
"CurrentAngle",
"CursorPosition",
"CurveSize0",
"CurveSize1",
"D",
"Damping",
"DesiredAngle",
"DestoryJointRadiusPercent",
"Disabled",
"DisplayDistanceType",
"DisplayName",
"ElasticBehavior",
"DisplayOrder",
"EmitterSize",
"Enabled",
"ExplosionType",
"ExtentsOffset",
"ExtentsOffsetWorldSpace",
"Face",
"FaceCamera",
"Faces",
"FarIntensity",
"FocusDistance",
"Font",
"FocusDistance",
"FreeLength",
"GoodbyeChoiceActive",
"GoodbyeDialog",
"Graphic",
"GripFoward",
"GripPos",
"GripRight",
"GripUp",
"HeadsUpDisplay",
"HealthDisplayDistance",
"HealthDisplayType",
"Heat",
"Height",
"HorizontalScrollBarInset",
"HoverImage",
"IgnoreGuiInset",
"Image",
"ImageColor3",
"ImagePressed",
"ImageRectOffset",
"ImageTransparency",
"InclinationAngle",
"InitialPrompt",
"Intensity",
"InUse",
"InverseSquareLaw",
"JumpPower",
"LeftArmColor",
"LeftArmColor3",
"Length",
"LeftLegColor",
"LeftLegColor3",
"LightEmission",
"LightInfluence",
"LineHeight",
"LineThickness",
"Locked",
"Looped",
"Magnitude",
"ManualActiavationOnly",
"Massless",
"Material",
"MaxActivationDistance",
"MaxAngularVelocity",
"MaxDistance",
"MaxForce",
"MaxFrictionTorque",
"MaxSpeed",
"MaxThrust",
"MaxVelocity",
"MeshId",
"MeshType",
"MidImage",
"MaxTorque",
"Modal",
"MoonAngularSize",
"MoonTextureId",
"Name",
"NameDisplayDistance",
"NameOcclusion",
"MultiLine",
"NearIntensity",
"NextSelectionDown",
"NextSelectionLeft",
"NextSelectionRight",
"NextSelectionUp",
"OffsetStudsU",
"OffsetStudsV",
"Opacity",
"OveralyTextureId",
"P",
"PantsTemplate",
"Parent",
"Part0",
"Part1",
"PixelsPerStud",
"PlaceholderColor3",
"PlaceholderText",
"PlaybackSpeed",
"PlatformStand",
"PlayerToHideFrom",
"Playing",
"Position",
"PrimaryAxisOnly",
"Purpose",
"Radius",
"ReactionForceEnabled",
"ReactionTorqueEnabled",
"Range",
"Reflectance",
"RenderFidelity",
"RequiresHandle",
"RelativeTo",
"ResetOnSpawn",
"ResponseDialog",
"Responsiveness",
"Restitution",
"RightArmColor",
"RightLegColor3",
"RigidityEnabled",
"RightArmColor3",
"RightLegColor",
"RigType",
"RiseVelocity",
"RollOffMode",
"RotationAxisVisible",
"Saturation",
"Scale",
"ScaleType",
"ScrollBarImageColor3",
"ScrollBarImageTransparency",
"ScrollBarThickness",
"ScrollingDirection",
"ScrollingEnabled",
"SecondaryColor",
"Segments",
"Selectable",
"Selected",
"SelectionImageObject",
"Shadows",
"ShirtTemplate",
"ShowNativeInput",
"Sit",
"Size",
"SizeConstraint",
"SizeRelativeOffset",
"SizingMode",
"SizeOffset",
"SkyboxBk",
"SkyboxDn",
"SkyboxFt",
"SkyboxLf",
"SkyboxRt",
"SkyboxUp",
"SlectionStart",
"SliceScale",
"SoundGroup",
"SoundId",
"SparkleColor",
"Spread",
"StarCount",
"Steer",
"SteerFloat",
"Stiffness",
"StudsPerTileU",
"StudsPerTileV",
"Style",
"SunAngularSize",
"SurfaceColor3",
"SurfaceTransparency",
"Target",
"TargetOffset",
"TargetPoint",
"TargetRadius",
"TargetSurface",
"TeamColor",
"Text",
"TextColor3",
"TextEditable",
"TextScaled",
"TextSize",
"TextStrokeColor3",
"TextStrokeTransparency",
"TextTransparency",
"TextTruncate",
"Texture",
"TextureID",
"TextureLength",
"TextureMode",
"TextureSpeed",
"TextWrapped",
"TextXAlignment",
"TextYAlignment",
"Thickness",
"Threshold",
"Throttle",
"ThrottleFloat",
"ThrustD",
"ThrustP",
"TimePosition",
"TintColor",
"TimePosition",
"Tone",
"ToolPunchThroughDistance",
"ToolTip",
"TopImage",
"TorsoColor",
"TorsoColor3",
"Transparency",
"TriggerDistance",
"TriggerOffset",
"TurnD",
"TurnP",
"TurnSpeed",
"UseJumpPower",
"UserDialog",
"Value",
"Velocity",
"VertexColor",
"Visible",
"VerticalScrollBarInset",
"VerticalScrollBarPosition",
"Width0",
"Width1",
"Volume",
"ZIndex",
"ZIndexBehavior",
"ZOffset",
}
function ReplaceRepeat(List)
for i = 1,#List do
local Replace = List[i]
local TTR1 = "success, response = pcall(function()"
local TTR2 = " if P." .. Replace .." == nil then"
local TTR3 = " else"
local TTR4 = ""
local TTR5 = " end"
local TTR6 = "end)"
local TTR7 = "if success then"
local TTR8 = " Text = ".."'"..Replace.."'" .. "..';' ..tostring(P.".. Replace..")"
local TTR9 = " table.insert(Properties,Text)"
local TTR10 = " success = nil"
local TTR11 = "end"
print(TTR1)
print(TTR2)
print(TTR3)
print(TTR4)
print(TTR5)
print(TTR6)
print(TTR7)
print(TTR8)
print(TTR9)
print(TTR10)
print(TTR11)
print("")
wait(0.1)
end
end
function ReplaceRepeat2(List)
for i = 1,#List do
local Replace = List[i]
local TTR1 = "success, response = pcall(function()"
local TTR2 = " if Split[1] == '".. Replace .."' then"
local TTR0 = " NewP.".. Replace .." = GetOriginalValue(Split,NewP.".. Replace .. ")"
local TTR3 = " else"
local TTR4 = "Error = Error .. 'ErrorMaker'"
local TTR5 = " end"
local TTR6 = "end)"
local TTR7 = "if success then"
local TTR8 = ""
local TTR8 = " NewP.".. Replace .." = GetOriginalValue(Split,NewP.".. Replace .. ")"
local TTR9 = ""
local TTR10 = " success = nil"
local TTR11 = "end"
print(TTR1)
print(TTR2)
print(TTR0)
print(TTR3)
print(TTR4)
print(TTR5)
print(TTR6)
print(TTR7)
print(TTR8)
print(TTR9)
print(TTR10)
print(TTR11)
print("")
wait(0.1)
end
end
wait(5)
ReplaceRepeat2(List)
The Other bits
--- Saving Parts
function GetProperties(P)
local Properties = {}
local Text
local success
local response
--- Paste RepeatWrite Output in here
end
function GetModelProperties(Model)
local Des = Model:GetDescendants()
local Result = ""
for i = 1,#Des do
local Props = GetProperties(Des[i])
Result = Result .. Props .. "[Split]"
end
return Result
end
----- Loading Parts
function LoadInstance(Text)
local Properties = string.split(Text,":")
local Class = string.split(Properties[1],";")
Class = Class[2]
local success
local response
local Error = nil
---- Paste RepeatWrite2 output in Here
end
function GetOriginalValue(Split,Property)
if type(Property) == "nil" then
return nil
end
if type(Property) == "number" then
return tonumber(Split[2])
end
if type(Property) == "string" then
return tostring(Split[2])
end
if type(Property) == "boolean" then
if Split[2] == "true" then
return true
end
if Split[2] == "false" then
return false
end
end
if type(Property) == "userdata" then
-- Will need a ton of work, For now this will do
-- This means setting color3 wont work and same with a lot of others
if Split[1] == "Color" then
local Color = Split[2]
Color = string.split(Color,", ")
return Color3.new(tonumber(Color[1]),tonumber(Color[2]),tonumber(Color[3]))
end
if Split[1] == "Size" or Split[1] == "Position" or Split[1] == "Velocity" or Split[1] == "Orientation" then
local Size = Split[2]
Size = string.split(Size,", ")
return Vector3.new(tonumber(Size[1]),tonumber(Size[2]),tonumber(Size[3]))
end
if Split[1] == "Material" then
local Mat = Split[2]
Mat = string.split(Mat,".")
return Mat[3]
end
return nil
end
end
function LoadModel(Text)
local Model = Instance.new("Part")
Model.Name = "Model"
Model.Transparency = 1
Model.Anchored = true
Model.Parent = game.Workspace
local Parts = string.split(Text,"[Split]")
for i = 1,#Parts do
local P = LoadInstance(Parts[i])
if P:IsA("BasePart") then
P.CanCollide = false
P.Parent = Model
P.Anchored = true
P.CanCollide = true
else
P.Parent = Model
end
wait(0.05)
end
end
Oh my, that’s a lot of properties lol.