Skip to content

Instantly share code, notes, and snippets.

@Elmuti
Created December 4, 2019 17:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Elmuti/c6e638631808726ff409c17c23925158 to your computer and use it in GitHub Desktop.
Save Elmuti/c6e638631808726ff409c17c23925158 to your computer and use it in GitHub Desktop.
local Orakel = require(game.ReplicatedStorage.Orakel.Main)
local XpToLevelTable = {
[1] = 400;
[2] = 900;
[3] = 1400;
[4] = 2100;
[5] = 2800;
[6] = 3600;
[7] = 4500;
[8] = 5400;
[9] = 6500;
[10] = 7600;
[11] = 8700;
[12] = 9800;
[13] = 11000;
[14] = 12300;
[15] = 13600;
[16] = 15000;
[17] = 16400;
[18] = 17800;
[19] = 19300;
[20] = 20800;
[21] = 22400;
[22] = 24000;
[23] = 25500;
[24] = 27200;
[25] = 28900;
[26] = 30500;
[27] = 32200;
[28] = 33900;
[29] = 36300;
[30] = 38800;
[31] = 0;
[32] = 0;
[33] = 0;
[34] = 0;
[35] = 0;
[36] = 0;
[37] = 0;
[38] = 0;
[39] = 0;
[40] = 0;
[41] = 0;
[42] = 0;
[43] = 0;
[44] = 0;
[45] = 0;
[46] = 0;
[47] = 0;
[48] = 0;
[49] = 0;
[50] = 0;
[51] = 0;
[52] = 0;
[53] = 0;
[54] = 0;
[55] = 0;
[56] = 0;
[57] = 0;
[58] = 0;
[59] = 0;
[60] = 0;
}
local RestedZones = {
DesertDelta_ShoreCity = true;
DesertDelta_Indoors = true;
}
local Player_MaxLevel = 60
local Player = {
Name = "";
Region = "Default";
TimeInRegion = 0;
Faction = "Blue";
PvPFlagged = false;
IsAfk = false;
InRestedZone = false;
Rested = false;
TimeRested = 0;
TimeOOC = 0;
InCombat = false;
Dueling = false;
Level = 1;
Experience = 0;
MaxHealth = 65;
Health = 65;
--Resources
MaxMana = 100;
Mana = 100;
MaxRage = 100;
Rage = 0;
MaxEnergy = 100;
Energy = 100;
}
Player.__index = Player
function Player.new(name, plrInstance, character)
local player = setmetatable({
PlayerInstance = plrInstance;
Character = character or plrInstance.Character;
Name = name;
}, Player)
player.RegionChanged = Orakel.CreateEvent("RegionChanged")
player.DamageTaken = Orakel.CreateEvent("DamageTaken")
player.AFKStatusChanged = Orakel.CreateEvent("AFKStatusChanged")
player.GainRestedState = Orakel.CreateEvent("GainRestedState")
player.PvPStatusChanged = Orakel.CreateEvent("PvPStatusChanged")
player.GainedXP = Orakel.CreateEvent("GainedXP")
player.LeveledUp = Orakel.CreateEvent("LeveledUp")
player.CombatStateChanged = Orakel.CreateEvent("CombatStateChanged")
player.RegionChanged.Event:Connect(function(region)
if RestedZones[region] then
player.InRestedZone = true
else
player.InRestedZone = false
end
player.Region = region
player.TimeInRegion = 0
end)
player.GainRestedState.Event:Connect(function()
player.Rested = true
end)
player.CombatStateChanged.Event:Connect(function(inCombat)
player.InCombat = inCombat
if inCombat then
player.TimeOOC = 0
end
end)
player.AFKStatusChanged.Event:Connect(function(isAfk)
if isAfk then
player.Character.PrimaryPart.UnitFrame.MainFrame.NameFrame.NameLabel.Text = "<AFK>" .. player.Name
else
player.Character.PrimaryPart.UnitFrame.MainFrame.NameFrame.NameLabel.Text = player.Name
end
end)
player.PvPStatusChanged.Event:Connect(function(isPvpFlagged)
if isPvpFlagged then
player.Character.PrimaryPart.UnitFrame.MainFrame.NameFrame.NameLabel.TextColor3 = Color3.fromRGB(55, 255, 0)
else
player.Character.PrimaryPart.UnitFrame.MainFrame.NameFrame.NameLabel.TextColor3 = Color3.fromRGB(58, 94, 255)
end
end)
player.LeveledUp.Event:Connect(function(newLevel)
print(player.Name .. " leveled up to level " .. newLevel .. " !")
end)
return player
end
function Player:Init()
local uf = game.ReplicatedStorage.UITemplates.UnitFrame:Clone()
uf.MainFrame.NameFrame.NameLabel.Text = self.Name
if self.PvPFlagged then
uf.MainFrame.NameFrame.NameLabel.TextColor3 = Color3.fromRGB(55, 255, 0)
else
uf.MainFrame.NameFrame.NameLabel.TextColor3 = Color3.fromRGB(58, 94, 255)
end
local torso = self.Character.PrimaryPart
uf.Adornee = torso
uf.Parent = torso
end
function Player:TakeDamage(damage, damagetype, attacker)
Player:SetHealth(self.Health - damage)
self.DamageTaken:Fire(damage)
end
function Player:LevelUp()
if self.Level >= Player_MaxLevel then
return
end
self.Level = self.Level + 1
self.LeveledUp:Fire(self.Level)
end
local function LevelDiff(level, moblevel)
if level > moblevel then
return -(level - moblevel)
elseif moblevel > level then
return -(moblevel - level)
elseif level == moblevel then
return 0
end
end
local function GetXpFromMob(level, moblevel)
local diff = LevelDiff(level, moblevel)
if diff < 10 then
return 0
end
local mobxp = 15
local xp = ((8 * level) + diff) * mobxp
return xp
end
function Player:GetNextLevelXp(level)
return XpToLevelTable[level]
end
function Player:GetRestedXP()
local percentageRestedPerDay = 0.2 --percentage of next level xp to gain per 24h of rested (Doubled for INN / CAPITAL)
local restedXP = self:GetNextLevelXp(self.Level) * percentageRestedPerDay * (self.TimeRested / 86400)
if self.InRestedZone then
restedXP = restedXP * 2
end
end
function Player:GainXp(xp)
if self.Level >= Player_MaxLevel then
return
end
local curXP = self.Experience
local restedBonus = self:GetRestedXP()
local newXP = curXP + xp
if restedBonus >= xp*2 then
newXP = newXP * 2
else
newXP = newXP + restedBonus
end
restedBonus = math.clamp(restedBonus - newXP, 0, self:GetNextLevelXp(self.Level))
local overxp = (self.Experience + newXP) - self:GetNextLevelXp(self.Level)
while overxp > 0 and self.Level < Player_MaxLevel do
self:LevelUp()
self.Experience = overxp
overxp = self.Experience - self:GetNextLevelXp(self.Level)
end
end
function Player:SetHealth(health)
health = math.clamp(health, 0, self.MaxHealth)
self.Health = health
return health
end
function Player:UpdateHeartbeat(dt) --1/30
end
function Player:Update(dt) --1/10
self.TimeInRegion = self.TimeInRegion + dt
if not self.InCombat then
self.TimeOOC = self.TimeOOC + dt
if self.TimeOOC >= 60 and not self.Rested then
self.GainRestedState:Fire()
end
else
self.TimeOOC = 0
end
if self.Rested then
self.TimeRested = self.TimeRested + dt
end
end
function Player:GetRegion()
return self.Region
end
return Player
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment