GMS.Processes = {} function GMS.RegisterProcess( name, tbl ) GMS.Processes[ name ] = tbl end GM.ProcessThinkHookTable = {} hook.Add( "Think", "gms_ProcessThinkHooks", function() for k, v in pairs( GAMEMODE.ProcessThinkHookTable ) do local think if ( v.Think ) then think = v:Think() end local basethink = v:BaseThink() if ( think or basethink or IsStopped ) then if ( v.Owner and v.Owner != NULL and v.Owner:IsValid() ) then v.Owner:Freeze( false ) v.Owner:StopProcessBar() v.Owner.InProcess = false v.Owner:SendMessage( "Cancelled.", 3, Color( 200, 0, 0, 255 ) ) end v.IsStopped = true timer.Destroy( "GMS_ProcessTimer_" .. v.TimerID ) GAMEMODE:RemoveProcessThink( v ) end end end ) function GM:RemoveProcessThink( tbl ) for k, v in pairs( self.ProcessThinkHookTable ) do if ( v == tbl ) then table.remove( self.ProcessThinkHookTable, k ) break end end end /* Base process */ local PROCESS = {} function PROCESS:BaseThink() if ( IsValid( ent ) ) then if ( self == nil or self.Owner == nil ) then return true end if ( !self.Owner:IsValid() or !self.Owner:IsConnected() or !self.Owner:Alive() ) then return true end end end function PROCESS:BaseStop() if ( !IsValid( self.Owner ) or !self.Owner:Alive() ) then return false end self.Owner:StopProcessBar() return true end PROCESS.Cancel = true PROCESS.Freeze = true GMS.Processes.BaseProcess = PROCESS /* Stealing */ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Stealing", self.Time, self.Cancel ) end function PROCESS:OnStop() if ( !self.Data.Ent ) then return end SPropProtection.PlayerMakePropOwner( self.Owner, self.Data.Ent ) self.Owner:IncXP( "Stealing", math.Clamp( math.Round( self.Time * 5 / self.Owner:GetSkill( "Stealing" ) ), 1, 1000 ) ) self.Owner:SendMessage( "Successfully stolen.", 3, Color( 50, 200, 50, 255 ) ) end GMS.RegisterProcess( "Steal", PROCESS ) /* Fruit eating process */ local PROCESS = {} PROCESS.SideGain = {} PROCESS.SideGain["melon"] = "Melon_Seeds" PROCESS.SideGain["orange"] = "Orange_Seeds" PROCESS.SideGain["banana"] = "Banana_Seeds" function PROCESS:OnStart() self.Owner:MakeProcessBar( "Eating Fruit", self.Time, self.Cancel ) self.Owner:EmitSound( Sound( "stranded/eat.wav" ) ) local owner = nil local ent = self.Data.Entity local plant = ent.PlantParent if ( plant ) then owner = plant:GetNWEntity( "plantowner" ) end if ( self.Data.Entity:GetModel() == "models/props_junk/watermelon01.mdl" ) then self.SideGain = "Melon Seeds" elseif ( self.Data.Entity:GetModel() == "models/props/cs_italy/orange.mdl" ) then self.SideGain = "Orange Seeds" elseif ( self.Data.Entity:GetModel() == "models/props/cs_italy/bananna_bunch.mdl" ) then self.SideGain = "Banana Seeds" end if ( plant ) then plant.Children = plant.Children - 1 if ( plant.Children <= 0 ) then plant:Fadeout() if ( IsValid( owner ) ) then owner:SetNWInt( "plants", owner:GetNWInt( "plants" ) - 1 ) end end end self.Data.Entity:Fadeout( 2 ) end function PROCESS:OnStop() if ( self.SideGain ) then local numto = 1 local numstart = 0 if ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_woodenspoon" ) then numto = numto + 2 numstart = numstart + 1 end local num = math.random( numstart, numto ) if ( num ~= 0 ) then self.Owner:IncResource( self.SideGain, num ) self.Owner:SendMessage( self.SideGain .. " ( " .. num .. "x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:EmitSound( Sound( "items/ammo_pickup.wav" ) ) end end self.Owner:SetFood( self.Owner.Hunger + 250 ) self.Owner:SendMessage( "You feel a little less hungry now.", 3, Color( 255, 255, 255, 255 ) ) end PROCESS.Cancel = false GMS.RegisterProcess( "EatFruit", PROCESS ) /* Food eating process */ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Eating", self.Time, self.Cancel ) self.Owner:EmitSound( Sound( "stranded/eat.wav" ) ) local ent = self.Data.Entity self.Value = ent.Value ent:Fadeout( 2 ) end function PROCESS:OnStop() self.Owner:SendMessage( "Restored " .. tostring( ( self.Value / 1000 ) * 100 ) .. "% food.", 3, Color( 10, 200, 10, 255 ) ) self.Owner:SetFood( self.Owner.Hunger + self.Value ) self.Owner:Heal( self.Value / 20 ) self.Owner:SendMessage( "Regained " .. tostring( self.Value / 20 ) .. " hp.", 3, Color( 255, 0, 0, 255 ) ) self.Owner:SetFood( self.Owner.Hunger + 250 ) self.Owner:SendMessage( "You feel a little less hungry now.", 3, Color( 255, 255, 255, 255 ) ) end PROCESS.Cancel = false GMS.RegisterProcess( "EatFood", PROCESS ) /*--------------------------------------------------------- Eat Berry ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Eating some berries", self.Time, self.Cancel ) self.StartTime = CurTime() self.Owner:EmitSound( Sound( "stranded/eat.wav" ) ) end function PROCESS:OnStop() self.Owner:DecResource( "Berries", 1 ) self.Owner:SendMessage( "You're a little less hungry and thirsty now.", 3, Color( 10, 200, 10, 255 ) ) if ( self.Owner.Hunger <= 900 ) then self.Owner:SetFood( self.Owner.Hunger + 100 ) elseif ( self.Owner.Hunger >= 900 ) then self.Owner:SetFood( 1000 ) end if ( self.Owner.Thirst <= 900 ) then self.Owner:SetThirst( self.Owner.Thirst + 100 ) elseif ( self.Owner.Thirst >= 900 ) then self.Owner:SetThirst( 1000 ) end end PROCESS.Cancel = false GMS.RegisterProcess( "EatBerry", PROCESS ) /*--------------------------------------------------------- Foraging process ---------------------------------------------------------*/ local PROCESS = {} PROCESS.Results = {} PROCESS.Results[1] = "Melon Seeds" PROCESS.Results[2] = "Banana Seeds" PROCESS.Results[3] = "Orange Seeds" PROCESS.Results[4] = "Grain Seeds" PROCESS.Results[5] = "Herbs" PROCESS.Results[6] = "Berries" PROCESS.Results[7] = "Baits" function PROCESS:OnStart() self.Owner:MakeProcessBar( "Foraging", self.Time, self.Cancel ) end function PROCESS:OnStop() local num = math.random( 1, 100 ) if ( num > 50 - self.Owner:GetSkill( "Harvesting" ) ) then local res = self.Results[math.random( 1, #self.Results )] local amount = math.random( 1, 3 ) self.Owner:IncResource( res , amount ) self.Owner:IncXP( "Harvesting", math.Clamp( math.Round( 50 / self.Owner:GetSkill( "Harvesting" ) ), 1, 1000 ) ) self.Owner:SendMessage( res .. " ( " .. amount .. "x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:EmitSound( Sound( "items/ammo_pickup.wav" ) ) else self.Owner:SendMessage( "Found nothing of interest", 3, Color( 255, 255, 255, 255 ) ) end end GMS.RegisterProcess( "Foraging", PROCESS ) /*--------------------------------------------------------- Looting process ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Looting", self.Time, self.Cancel ) end function PROCESS:OnStop() self.Data.Entity:Fadeout( 2 ) for k, v in pairs( self.Data.Resources ) do self.Owner:SendMessage( k .. " ( " .. v .. "x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:IncResource( k, v ) end self.Owner:EmitSound( Sound( "items/ammo_pickup.wav" ) ) end GMS.RegisterProcess( "Loot", PROCESS ) /*--------------------------------------------------------- Salvaging process ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Salvaging", self.Time, self.Cancel ) end function PROCESS:OnStop() local ent = self.Data.Entity local ply = self.Owner if ( ent.NormalProp == true && SPropProtection.PlayerCanTouch( ply, ent ) ) then local vol = ent:GetVolume() local res = GMS.MaterialResources[ self.Data.MatType ] //local cost = math.Round( 0.6 * math.ceil( vol * ( GetConVarNumber( "gms_CostsScale" ) / 2 ) ) ) local cost = math.Round( 0.6 * math.ceil( vol * 0.5 ) ) ply:IncResource( res, cost ) ply:SendMessage( "Gained " .. string.Replace( res, "_", " " ) .. " ( " .. cost .. "x ) from salvaging.", 3, Color( 255, 255, 255, 255 ) ) elseif ( table.HasValue( GMS.StructureEntities, ent:GetClass() ) && SPropProtection.PlayerCanTouch( ply, ent ) ) then local structures = GMS.Combinations[ "Structures" ] local costs = {} for name, t in pairs( structures ) do if ( t.Results == ent:GetClass() ) then costs = t.Req end end for res, num in pairs( costs ) do local cost = math.Round( 0.6 * num ) ply:IncResource( res, cost ) ply:SendMessage( "Gained " .. string.Replace( res, "_", " " ) .. " ( " .. cost .. "x ) from salvaging.", 3, Color( 255, 255, 255, 255 ) ) end end ent:Fadeout() ply:EmitSound( Sound( "items/ammo_pickup.wav" ) ) end GMS.RegisterProcess( "Salvage", PROCESS ) /*--------------------------------------------------------- Digging ---------------------------------------------------------*/ local PROCESS = {} PROCESS.Rarities = {} PROCESS.Rarities[1] = "Iron" PROCESS.Rarities[2] = "Sand" PROCESS.Rarities[3] = "Rope" PROCESS.Rarities[4] = "Bass" PROCESS.Rarities[5] = "Sand" PROCESS.Rarities[6] = "Stone" function PROCESS:OnStart() self.Owner:MakeProcessBar( "Digging", self.Time, self.Cancel ) self.StartTime = CurTime() self:PlaySound() end function PROCESS:PlaySound() if ( CurTime() - self.StartTime > self.Time ) then return end if ( !self.Owner.InProcess || self.StartTime != self.Owner.ProcessTable.StartTime ) then return end if ( self.Owner:Alive() ) then self.Owner:GetActiveWeapon():DoEffects( self.Owner:GetEyeTrace() ) self.Owner:EmitSound( Sound( "player/footsteps/gravel" .. math.random( 1, 4 ) .. ".wav" ) ) timer.Simple( 1.5, function() self:PlaySound() end ) end end function PROCESS:OnStop() local num = math.random( 1, 100 ) if ( num < 10 ) then local res = self.Rarities[math.random( 1, #self.Rarities )] if ( self.Data and self.Data.Sand and math.random() > 0.50 ) then res = "Sand" end self.Owner:IncResource( res, 1 ) self.Owner:SendMessage( res .. " ( 1x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:SendMessage( "You found something weird!", 3, Color( 255, 255, 255, 255 ) ) self.Owner:EmitSound( Sound( "items/ammo_pickup.wav" ) ) elseif ( num > 10 and num < 40 ) then self.Owner:SendMessage( "Found nothing of interest", 3, Color( 255, 255, 255, 255 ) ) else local tr = self.Owner:TraceFromEyes( 200 ) local ent = ents.Create( "prop_physics" ) ent:SetPos( tr.HitPos + Vector( 0, 0, 10 ) ) ent:SetModel( GMS.SmallRockModel ) ent:Spawn() SPropProtection.PlayerMakePropOwner( self.Owner, ent ) ent:Fadein( 2 ) ent.Uses = 10 end end GMS.RegisterProcess( "Dig", PROCESS ) /*--------------------------------------------------------- Filter ground process ---------------------------------------------------------*/ local PROCESS = {} PROCESS.Results = {} PROCESS.Results[1] = "Sand" PROCESS.Results[2] = "Sand" PROCESS.Results[3] = "Sand" PROCESS.Results[4] = "Glass" function PROCESS:OnStart() self.Owner:MakeProcessBar( "Filtering Ground", self.Time, self.Cancel ) end function PROCESS:OnStop() local num = math.random( 1, 100 ) if ( num > 50 - self.Owner:GetSkill( "Harvesting" ) ) then local res = self.Results[math.random( 1, #self.Results )] local amount = math.random( 1, 3 ) self.Owner:IncResource( string.gsub( res, " ", "_" ), amount ) self.Owner:IncXP( "Harvesting", math.Clamp( math.Round( 50 / self.Owner:GetSkill( "Harvesting" ) ), 1, 1000 ) ) self.Owner:SendMessage( res .. " ( " .. amount .. "x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:EmitSound( Sound( "items/ammo_pickup.wav" ) ) else self.Owner:SendMessage( "Found nothing of interest", 3, Color( 200, 10, 10, 255 ) ) end end GMS.RegisterProcess( "FilterGround", PROCESS ) /*--------------------------------------------------------- Grain harvesting ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Harvesting Grain", self.Time, self.Cancel ) local ent = self.Data.Entity if ( IsValid( ent ) && !ent.Uses ) then ent.Uses = math.random( 1, 3 ) end end function PROCESS:OnStop() local num = math.random( 1, 100 ) local add = 0 if ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_sickle" ) then add = add + 30 end if ( num > 50 - self.Owner:GetSkill( "Harvesting" ) - add ) then local amount = math.random( 1, 2 ) self.Owner:IncResource( "Grain Seeds", amount ) self.Owner:IncXP( "Harvesting", math.Clamp( math.Round( 50 / self.Owner:GetSkill( "Harvesting" ) ), 1, 1000 ) ) self.Owner:SendMessage( "Grain Seeds ( " .. amount .. "x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:EmitSound( Sound( "items/ammo_pickup.wav" ) ) local ent = self.Data.Entity local owner = ent:GetNWEntity( "plantowner" ) if ( IsValid( ent ) && ent.Uses ) then ent.Uses = ent.Uses - 1 if ( ent.Uses <= 0 ) then if ( IsValid( owner ) ) then owner:SetNWInt( "plants", owner:GetNWInt( "plants" ) - 1 ) end ent:Fadeout() end end else self.Owner:SendMessage( "Failed.", 3, Color( 200, 0, 0, 255 ) ) end end GMS.RegisterProcess( "HarvestGrain", PROCESS ) /*--------------------------------------------------------- Berry harvesting ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Harvesting Bush", self.Time, self.Cancel ) local ent = self.Data.Entity if ( IsValid( ent ) && !ent.Uses ) then ent.Uses = math.random( 1, 3 ) end end function PROCESS:OnStop() local num = math.random( 1, 100 ) local add = 0 if ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_sickle" ) then add = add + 25 end if ( num > 50 - self.Owner:GetSkill( "Harvesting" ) - add ) then local amount = math.random( 1, 2 ) self.Owner:IncResource( "Berries", amount ) self.Owner:IncXP( "Harvesting", math.Clamp( math.Round( 50 / self.Owner:GetSkill( "Harvesting" ) ), 1, 1000 ) ) self.Owner:SendMessage( "Berries ( " .. amount .. "x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:EmitSound( Sound( "items/ammo_pickup.wav" ) ) local ent = self.Data.Entity local owner = ent:GetNWEntity( "plantowner" ) if ( IsValid( ent ) && ent.Uses ) then ent.Uses = ent.Uses - 1 if ( ent.Uses <= 0 ) then if ( IsValid( owner ) ) then owner:SetNWInt( "plants", owner:GetNWInt( "plants" ) - 1 ) end ent:Fadeout() end end else self.Owner:SendMessage( "Failed.", 3, Color( 200, 0, 0, 255 ) ) end end GMS.RegisterProcess( "HarvestBush", PROCESS ) /*--------------------------------------------------------- Make Campfire process ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() if ( GetConVarNumber( "gms_campfire" ) <= 0 ) then return end self.Owner:MakeProcessBar( "Making Campfire", self.Time, self.Cancel ) self.Owner:EmitSound( "stranded/start_campfire.wav" ) end function PROCESS:OnStop() if ( GetConVarNumber( "gms_campfire" ) <= 0 ) then return end local num = math.random( 1, 3 ) if ( num == 1 ) then self.Owner:SendMessage( "Failed.", 3, Color( 200, 0, 0, 255 ) ) else self.Data.Entity:MakeCampfire() self.Owner:SendMessage( "Made campfire.", 5, Color( 10, 200, 100, 255 ) ) self.Owner:DecResource( "Wood", 5 ) end end GMS.RegisterProcess( "Campfire", PROCESS ) /*--------------------------------------------------------- Wood cutting ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Chopping Wood", self.Time, self.Cancel ) self.StartTime = CurTime() self:PlaySound() if ( !self.Data.Entity.Uses ) then self.Data.Entity.Uses = 100 end end function PROCESS:PlaySound() if ( CurTime() - self.StartTime > self.Time ) then return end if ( !self.Owner.InProcess || self.StartTime != self.Owner.ProcessTable.StartTime ) then return end if ( self.Owner:Alive() ) then self.Owner:GetActiveWeapon():DoEffects( self.Owner:GetEyeTrace() ) self.Owner:EmitSound( Sound( "physics/wood/wood_solid_impact_bullet" .. tostring( math.random( 1, 5 ) ) .. ".wav" ) ) timer.Simple( 1.5, function() self:PlaySound() end ) end end function PROCESS:OnStop() local num = math.random( 1, 100 ) if ( num < self.Data.Chance + self.Owner:GetSkill( "Lumbering" ) ) then local num2 = math.random( self.Data.MinAmount, self.Data.MaxAmount ) self.Owner:IncResource( "Wood", num2 ) self.Owner:IncXP( "Lumbering", math.Clamp( math.Round( 50 / self.Owner:GetSkill( "Lumbering" ) ), 1 , 1000 ) ) self.Owner:SendMessage( "Wood ( " .. num2 .. "x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:EmitSound( Sound( "items/ammo_pickup.wav" ) ) if ( self.Data.Entity and self.Data.Entity.Uses ) then self.Data.Entity.Uses = self.Data.Entity.Uses - num2 end else self.Owner:SendMessage( "Failed.", 3, Color( 200, 0, 0, 255 ) ) end if ( self.Data.Entity != NULL ) then if ( self.Data.Entity.Uses <= 0 ) then self.Data.Entity:EmitSound( "stranded/tree_fall.wav" ) self.Data.Entity:Fadeout() end end end GMS.RegisterProcess( "WoodCutting", PROCESS ) /* --------------------------------------------------------- Mining --------------------------------------------------------- */ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Mining", self.Time, self.Cancel ) self.StartTime = CurTime() self:PlaySound() if ( !self.Data.Entity.Uses ) then self.Data.Entity.Uses = 250 end end function PROCESS:PlaySound() if ( CurTime() - self.StartTime > self.Time ) then return end if ( !self.Owner.InProcess || self.StartTime != self.Owner.ProcessTable.StartTime ) then return end if ( self.Owner:Alive() ) then self.Owner:GetActiveWeapon():DoEffects( self.Owner:GetEyeTrace() ) self.Owner:EmitSound( Sound( "physics/glass/glass_bottle_impact_hard" .. tostring( math.random( 1, 3 ) ) .. ".wav" ) ) timer.Simple( 1.5, function() self:PlaySound() end ) end end function PROCESS:OnStop() local num = math.random( 1, 100 ) local num2 = 1 if ( num < self.Data.Chance + self.Owner:GetSkill( "Mining" ) ) then if ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_stonepickaxe" ) then num2 = math.random( 1, 2 ) elseif ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_copperpickaxe" ) then num2 = math.random( 1, 3 ) elseif ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_ironpickaxe" ) then num2 = math.random( 1, 4 ) elseif ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_techpickaxe" ) then num2 = math.random( 1, 5 ) elseif ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_silverpickaxe" ) then num2 = math.random( 1, 6 ) elseif ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_goldpickaxe" ) then num2 = math.random( 1, 7 ) elseif ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_steelpickaxe" ) then num2 = math.random( 1, 8 ) elseif ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_platinumpickaxe" ) then num2 = math.random( 1, 9 ) elseif ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_pickaxeofdjarex" ) then num2 = math.random( 85, 85 ) elseif ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_mithrilpickaxe" ) then num2 = math.random( 1, 10 ) elseif ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_runeapickaxe" ) then num2 = math.random( 1, 8 ) elseif ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_runeepickaxe" ) then num2 = math.random( 1, 8 ) elseif ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_runefpickaxe" ) then num2 = math.random( 1, 8 ) elseif ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_runewpickaxe" ) then num2 = math.random( 1, 8 ) end local num3 = math.random( self.Data.MinAmount, self.Data.MaxAmount ) if ( num2 == 1 ) then self.Owner:IncResource( "Stone", num3 ) self.Owner:SendMessage( "Stone ( " .. num3 .. "x )", 3, Color( 10, 200, 10, 255 ) ) elseif ( num2 == 2 ) then self.Owner:IncResource( "Copper Ore", num3 ) self.Owner:SendMessage( "Copper Ore ( "..num3 .. "x )", 3, Color( 10, 200, 10, 255 ) ) elseif ( num2 == 3 ) then self.Owner:IncResource( "Iron Ore", num3 ) self.Owner:SendMessage( "Iron Ore ( " .. num3 .. "x )", 3, Color( 10, 200, 10, 255 ) ) elseif ( num2 == 4 ) then self.Owner:IncResource( "Tech Ore", num3 ) self.Owner:SendMessage( "Tech Ore ( " .. num3 .. "x )", 3, Color( 10, 200, 10, 255 ) ) elseif ( num2 == 5 ) then self.Owner:IncResource( "Silver Ore", num3 ) self.Owner:SendMessage( "Silver Ore ( " .. num3 .. "x )", 3, Color( 10, 200, 10, 255 ) ) elseif ( num2 == 6 ) then self.Owner:IncResource( "Gold Ore", num3 ) self.Owner:SendMessage( "Gold Ore ( " .. num3 .. "x )", 3, Color( 10, 200, 10, 255 ) ) elseif ( num2 == 7 ) then self.Owner:IncResource( "Steel Ore", num3 ) self.Owner:SendMessage( "Steel Ore ( " .. num3 .. "x )", 3, Color( 10, 200, 10, 255 ) ) elseif ( num2 == 8 ) then self.Owner:IncResource( "Platinum Ore", num3 ) self.Owner:SendMessage( "Platinum Ore ( " .. num3 .. "x )", 3, Color( 10, 200, 10, 255 ) ) elseif ( num2 == 85 ) then self.Owner:IncResource( "Strange Stone", num3 ) self.Owner:SendMessage( "Strange Stone ( " .. num3 .. "x ) ", 3, Color( 0, 247, 255, 255) ) elseif ( num2 == 9 ) then self.Owner:IncResource( "Mithril Ore", num3 ) self.Owner:SendMessage( "Mithril Ore ( " .. num3 .. "x ) ", 3, Color(10, 200, 10, 255) ) elseif ( num2 == 10) then self.Owner:IncResource( "Adamantine Ore", num3 ) self.Owner:SendMessage( "Adamantine Ore( " .. num3 .. "x ) ", 3, Color(255,0, 111, 255) ) end self.Owner:IncXP( "Mining", math.Clamp( math.Round( 50 / self.Owner:GetSkill( "Mining" ) ), 1, 1000 ) ) self.Owner:EmitSound( Sound( "items/ammo_pickup.wav" ) ) if ( self.Data.Entity and self.Data.Entity.Uses ) then self.Data.Entity.Uses = self.Data.Entity.Uses - num3 end else self.Owner:SendMessage( "Failed.", 3, Color( 200, 0, 0, 255 ) ) end if ( GetConVarNumber( "gms_FadeRocks" ) == 1 and self.Data.Entity != NULL ) then if ( self.Data.Entity.Uses <= 0 ) then self.Data.Entity:Fadeout() end end end GMS.RegisterProcess( "Mining", PROCESS ) /*--------------------------------------------------------- Sprout collect ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() if ( self.Owner:HasUnlock( "Sprout_Collecting" ) ) then self.Owner:MakeProcessBar( "Loosening sprout", self.Time, self.Cancel ) else self.IsStopped = true end end function PROCESS:OnStop() local num = math.random( 1, 100 ) local add = 0 if ( IsValid( self.Owner:GetActiveWeapon() ) && self.Owner:GetActiveWeapon():GetClass() == "gms_sickle" ) then add = add + 30 end if ( num > 50 - self.Owner:GetSkill( "Harvesting" ) - add ) then self.Owner:IncResource( "Sprouts", 1 ) self.Owner:IncXP( "Harvesting", math.Clamp( math.Round( 50 / self.Owner:GetSkill( "Harvesting" ) ), 1, 1000 ) ) self.Owner:SendMessage( "Sprout ( 1x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:EmitSound( Sound( "items/ammo_pickup.wav" ) ) else self.Owner:SendMessage( "Failed.", 3, Color( 200, 0, 0, 255 ) ) end end GMS.RegisterProcess( "SproutCollect", PROCESS ) /*--------------------------------------------------------- Plant Melon ---------------------------------------------------------*/ /*Alright, let's refactor this planting code*/ local plant_generic = { {"Watermelon","Melon Seeds","melon","PlantMelon"}, {"Banana","Banana Seeds","banana","PlantBanana"}, {"Orange","Orange Seeds","orange","PlantOrange"}, {"Grain","Grain Seeds","grain","PlantGrain"}, {"Berry Bush","Berries","berry","PlantBush"}, {"Tree","Sprouts","tree","PlantTree"}, } for k,v in pairs(plant_generic) do local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Planting " .. v[1], self.Time, self.Cancel) end function PROCESS:OnStop() self.Owner:DecResource(v[2],1) self.Owner:IncXP( "Planting", math.Clamp( math.Round(50 / self.Owner:GetSkill("Planting")),1,1000)) self.Owner:SendMessage( "Successfully planted.", 3, Color(10,200,10,255)) local ent = ents.Create("gms_seed") SPropProtection.PlayerMakePropOwner(self.Owner, ent) ent:SetPos( self.Data.Pos) ent:Setup(v[3],160-math.Clamp(self.Owner:GetSkill("planting"),0,60) + math.Round(-20,20),self.Owner) ent:Spawn() end GMS.RegisterProcess(v[4], PROCESS) end /*--------------------------------------------------------- Assembling ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Assembling", self.Time, self.Cancel ) end function PROCESS:OnStop() self.Owner:SendMessage( "Assembly successful.", 3, Color( 10, 200, 10, 255 ) ) end PROCESS.Cancel = false GMS.RegisterProcess( "Assembling", PROCESS ) /*--------------------------------------------------------- Fishing ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Fishing", self.Time, self.Cancel ) self.Owner:EmitSound( "stranded/start_fishing.wav" ) end function PROCESS:OnStop() local num = math.random( 1, 100 ) if ( !self.Owner.Resources['Baits'] or self.Owner.Resources['Baits'] < 1 ) then self.Data.Chance = self.Data.Chance * 0.25 end if ( num < self.Data.Chance + self.Owner:GetSkill( "Fishing" ) ) then if ( self.Owner.Resources['Baits'] and self.Owner.Resources['Baits'] > 0 ) then self.Owner:DecResource( "Baits", 1 ) end if ( num < ( self.Data.Chance + self.Owner:GetSkill( "Fishing" ) ) / 1.5 ) then self.Owner:IncResource( "Bass", 1 ) self.Owner:SendMessage( "Bass ( 1x )", 3, Color( 10, 200, 10, 255 ) ) elseif ( num >= ( self.Data.Chance + self.Owner:GetSkill( "Fishing" ) ) / 1.5 && num < ( self.Data.Chance + self.Owner:GetSkill( "Fishing" ) ) / 1.2 ) then self.Owner:IncResource( "Trout", 1 ) self.Owner:SendMessage( "Trout ( 1x )", 3, Color( 10, 200, 10, 255 ) ) elseif ( num >= ( self.Data.Chance + self.Owner:GetSkill( "Fishing" ) ) / 1.2 && num < self.Data.Chance + self.Owner:GetSkill( "Fishing" ) ) then self.Owner:IncResource( "Salmon", 1 ) self.Owner:SendMessage( "Salmon ( 1x )", 3, Color( 10, 200, 10, 255 ) ) end self.Owner:IncXP( "Fishing", math.Clamp( math.Round( 250 / self.Owner:GetSkill( "Fishing" ) ), 1, 1000 ) ) self.Owner:EmitSound( Sound( "ambient/water/water_splash" .. math.random( 1, 3 ) .. ".wav" ) ) else self.Owner:SendMessage( "Failed.", 3, Color( 200, 0, 0, 255 ) ) end end GMS.RegisterProcess( "Fishing", PROCESS ) /*--------------------------------------------------------- Advanced Fishing ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Fishing", self.Time, self.Cancel ) self.Owner:EmitSound( "stranded/start_fishing.wav" ) end function PROCESS:OnStop() local num = math.random( 1, 100 ) if ( !self.Owner.Resources['Baits'] or self.Owner.Resources['Baits'] < 1 ) then self.Data.Chance = self.Data.Chance * 0.25 end local fishables = { {"Bass",999,2}, {"Trout",2,1.5}, {"Salmon",1.5,1.2}, {"Shark",1.2,1}, } if ( num < self.Data.Chance + self.Owner:GetSkill( "Fishing" ) ) then if ( self.Owner.Resources['Baits'] and self.Owner.Resources['Baits'] > 0 ) then self.Owner:DecResource( "Baits", 1 ) end local sdc = self.Data.Chance + self.Owner:GetSkill("Fishing") for k,v in pairs(fishables) do if( (num >= (sdc/v[2])) and (num < (sdc/v[3])) ) then self.Owner:IncResource(v[1],1) self.Owner:SendMessage(v[1] .. "( 1x )", 3, Color(10,200,10,255)) break end end self.Owner:IncXP( "Fishing", math.Clamp( math.Round( 250 / self.Owner:GetSkill( "Fishing" ) ), 1, 1000 ) ) self.Owner:EmitSound( Sound( "ambient/water/water_splash" .. math.random( 1, 3 ) .. ".wav" ) ) else self.Owner:SendMessage( "Failed.", 3, Color( 200, 0, 0, 255 ) ) end end GMS.RegisterProcess( "AdvancedFishing", PROCESS ) /*--------------------------------------------------------- Bottle Water ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Bottling Water", self.Time, self.Cancel ) end function PROCESS:OnStop() if (self.Owner:GetActiveWeapon():GetClass() == "gms_bucket") then self.Owner:IncResource( "Water Bottles", 10 ) self.Owner:SendMessage( "Water Bottle ( 10x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:EmitSound( Sound( "ambient/water/water_spray" .. math.random( 1, 3 ) .. ".wav" ) ) else self.Owner:IncResource( "Water Bottles", 1 ) self.Owner:SendMessage( "Water Bottle ( 1x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:EmitSound( Sound( "ambient/water/water_spray" .. math.random( 1, 3 ) .. ".wav" ) ) end end GMS.RegisterProcess( "BottleWater", PROCESS ) /*--------------------------------------------------------- Drink bottle ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Drinking Bottle", self.Time, self.Cancel ) self.StartTime = CurTime() self:PlaySound() end function PROCESS:PlaySound() if ( CurTime() - self.StartTime > self.Time ) then return end if ( !self.Owner.InProcess || self.StartTime != self.Owner.ProcessTable.StartTime ) then return end if ( self.Owner:Alive() ) then self.Owner:EmitSound( Sound( "npc/barnacle/barnacle_gulp" .. math.random( 1, 2 ) .. ".wav" ) ) timer.Simple( 0.75, function() self:PlaySound() end ) end end function PROCESS:OnStop() self.Owner:DecResource( "Water_Bottles", 1 ) self.Owner:SendMessage( "You're a little less thirsty now.", 3, Color( 10, 200, 10, 255 ) ) if ( self.Owner.Thirst <= 750 ) then self.Owner:SetThirst( self.Owner.Thirst + 250 ) elseif ( self.Owner.Thirst >= 750 ) then self.Owner:SetThirst( 1000 ) end end PROCESS.Cancel = false GMS.RegisterProcess( "DrinkBottle", PROCESS ) /*--------------------------------------------------------- Take Medicine ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() if ( self.Owner:Health() >= 200 or ( self.Owner:Health() >= 150 and self.Owner:HasUnlock( "Master_Survivalist" ) != true ) or ( self.Owner:Health() >= 100 and self.Owner:HasUnlock( "Adept_Survivalist" ) != true ) ) then self.Owner:SendMessage( "You're feeling good, why would you heal yourself.", 3, Color( 200, 0, 0, 255 ) ) else self.Owner:MakeProcessBar( "Taking Medicine", self.Time, self.Cancel ) self.Owner:EmitSound( Sound( "items/smallmedkit1.wav" ) ) end end function PROCESS:OnStop() if ( self.Owner:Health() >= 200 or ( self.Owner:Health() >= 150 and self.Owner:HasUnlock( "Master_Survivalist" ) != true ) or ( self.Owner:Health() >= 100 and self.Owner:HasUnlock( "Adept_Survivalist" ) != true ) ) then return end self.Owner:DecResource( "Medicine", 1 ) self.Owner:SendMessage( "You're feeling a bit better now.", 3, Color( 10, 200, 10, 255 ) ) self.Owner:Heal( 10 ) end GMS.RegisterProcess( "TakeMedicine", PROCESS ) /*--------------------------------------------------------- Cooking ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Cooking " .. self.Data.Name, self.Time, self.Cancel ) self.Sound = CreateSound( self.Owner, Sound( "npc/headcrab/headcrab_burning_loop2.wav" ) ) self.Sound:Play() end function PROCESS:OnStop() local num = math.random( 1, 100 ) if ( num + self.Owner:GetSkill( "Cooking" ) >= 50 ) then self.Owner:SendMessage( "Successfully cooked.", 3, Color( 10, 200, 10, 255 ) ) self.Owner:IncXP( "Cooking", math.Clamp( math.Round( 150 / self.Owner:GetSkill( "Cooking" ) ), 1, 1000 ) ) local food = ents.Create( "gms_food" ) food:SetPos( self.Owner:TraceFromEyes( 70 ).HitPos + Vector( 0, 0, 5 ) ) SPropProtection.PlayerMakePropOwner( self.Owner, food ) food.Value = self.Data.FoodValue food.Name = self.Data.Name food:Spawn() food:SetFoodInfo( self.Data.Name ) timer.Simple( math.random( 240, 320 ), function() if ( IsValid( food ) ) then food:Fadeout( 2 ) end end ) for k, v in pairs( self.Data.Cost ) do self.Owner:DecResource( k, v ) end else self.Owner:SendMessage( "Failed.", 3, Color( 200, 0, 0, 255 ) ) local num = math.random( 1, 2 ) if ( num == 1 ) then for k, v in pairs( self.Data.Cost ) do self.Owner:DecResource( k, v ) end self.Owner:SendMessage( "The ingredients was wasted!", 3, Color( 200, 0, 0, 255 ) ) end end self.Sound:Stop() end GMS.RegisterProcess( "Cook", PROCESS ) /*--------------------------------------------------------- Make Weapon ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Crafting " .. self.Data.Name, self.Time, self.Cancel ) end function PROCESS:OnStop() self.Owner:SendMessage( "Made a " .. self.Data.Name .. ".", 3, Color( 10, 200, 10, 255 ) ) self.Owner:IncXP( "Weapon_Crafting", math.Clamp( math.Round( 50 / self.Owner:GetSkill( "Weapon_Crafting" ) ), 1, 1000 ) ) if ( self.Owner:HasWeapon( self.Data.Class ) ) then local weap = ents.Create( self.Data.Class ) weap:SetPos( self.Owner:TraceFromEyes( 100 ).HitPos + Vector( 0, 0, 15 ) ) weap:Spawn() SPropProtection.PlayerMakePropOwner( self.Owner, weap ) else self.Owner:Give( self.Data.Class ) end for k, v in pairs( self.Data.Cost ) do self.Owner:DecResource( k, v ) end end GMS.RegisterProcess( "MakeWeapon", PROCESS ) /*--------------------------------------------------------- MakeGeneric ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Making " .. self.Data.Name, self.Time, self.Cancel ) end function PROCESS:OnStop() for k, v in pairs( self.Data.Cost ) do self.Owner:DecResource( k, v ) end for k, v in pairs( self.Data.Res ) do self.Owner:SendMessage( "Made " .. string.gsub( k, "_", " " ) .. " ( " .. v .. "x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:IncResource( k, v ) end end GMS.RegisterProcess( "MakeGeneric", PROCESS ) /*--------------------------------------------------------- Make Building ---------------------------------------------------------*/ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Setting up " .. self.Data.Name .. " site", self.Time, self.Cancel ) end function PROCESS:OnStop() self.Owner:SendMessage( "Made a " .. self.Data.Name .. " site.", 3, Color( 10, 200, 10, 255 ) ) if ( self.Owner:GetBuildingSite() and self.Owner:GetBuildingSite():IsValid() ) then ent = self.Owner:GetBuildingSite() ent:Remove() end local site = self.Owner:CreateStructureBuildingSite( self.Data.Pos, self.Owner:GetAngles(), self.Data.BuildSiteModel, self.Data.Class, self.Data.Cost, self.Data.Name ) end GMS.RegisterProcess( "MakeBuilding", PROCESS ) /* Smelt */ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Smelting " .. self.Data.Name, self.Time, self.Cancel ) end function PROCESS:OnStop() for k, v in pairs( self.Data.Cost ) do self.Owner:DecResource( k, v ) end for k, v in pairs( self.Data.Res ) do self.Owner:SendMessage( "Made " .. string.gsub( k, "_", " " ) .. " ( " .. v .. "x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:IncResource( k, v ) self.Owner:IncXP( "Smelting", math.Clamp( math.Round( ( v * 10 ) / self.Owner:GetSkill( "Smelting" ) ), 1, 1000 ) ) end end GMS.RegisterProcess( "Smelt", PROCESS ) /* Crush */ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Crushing " .. self.Data.Name, self.Time, self.Cancel ) end function PROCESS:OnStop() for k, v in pairs( self.Data.Cost ) do self.Owner:DecResource( k, v ) end for k, v in pairs( self.Data.Res ) do self.Owner:SendMessage( "Made " .. string.gsub( k, "_", " " ) .. " ( " .. v .. "x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:IncResource( k, v ) end end GMS.RegisterProcess( "Crush", PROCESS ) /* Processing */ local PROCESS = {} function PROCESS:OnStart() self.Owner:MakeProcessBar( "Processing " .. self.Data.Name, self.Time, self.Cancel ) end function PROCESS:OnStop() for k, v in pairs( self.Data.Cost ) do self.Owner:DecResource( k, v ) end for k, v in pairs( self.Data.Res ) do self.Owner:IncXP( "Weapon_Crafting", math.Clamp( math.Round( 150 / self.Owner:GetSkill( "Weapon_Crafting" ) ), 1, 1000 ) ) self.Owner:SendMessage( "Made " .. string.gsub( k, "_", " " ) .. " ( " .. v .. "x )", 3, Color( 10, 200, 10, 255 ) ) self.Owner:IncResource( k, v ) end end GMS.RegisterProcess( "Processing", PROCESS )