Created
December 4, 2019 17:32
-
-
Save Elmuti/c6e638631808726ff409c17c23925158 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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