PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : World Model change



Dunkelbier
21.06.2007, 10:06
Hi!

Ich habe eine Waffe gebaut, die sich nach einem Rechtsklick ein einen Kampfstab "verwandelt". Damit es sich dann besser kämpfen lässt, schaltet das Spiel dann auf die 3rd-Person Sicht. Soweit klappt auch alles.

Mein Problem ist jetzt, das ich 2 World Modelle benötige, einmal die eingefahrene und einmal die ausgefahrene Waffe.

Im Weapon Script lässt sich mit SWEP.WeaponModel allerdings nur einmal das World-Model einstellen.

Wenn ich versuche die "Variable" z.B. durch Second Fire zu ändern bekomme ich folgenden Fehler: attempt to index global 'SWEP' (a nil value)

Irgendwie muss das doch machbar sein - Immerhin wurde das ganze bei CSS mit der USP und der M4 ja auch gemacht.

Dunkelbier

*DEAD*Pr0no0b
21.06.2007, 10:11
Zeig die Stelle mit dem Code zum Model-Ändern mal. Vielleicht hast du irgendwo ein Punkt oder so vergessen (kenn mich aber damit auch nicht wirklich aus).
Vielleicht hilfts ja anderen.

Vielleicht geht ja so:

function SWEP:SecondaryAttack()
if(ModelSet == 0) then //kA ob das ModelSet heist

if(SERVER) then
self.Owner:SWEP.WorldModel = "model1";
end

ModelSet = 1

else (ModelSet == 1) then

if(SERVER) then
self.Owner:SWEP.WorldModel = "model2";
end

else
if(SERVER) then
self.Owner:SWEP.WorldModel = "model1";
end

ModelSet = 0

end
end

end

Vielleicht hab ich zu viele "End"'s hingesetzt, ich weiß auch nicht, obs so funktioniert.

Hui, Beitrag um 11:11 geschrieben :D

Dunkelbier
21.06.2007, 10:17
Hier mal das Lua Script

Der unten deaktivierte Teil



if change == false then
SWEP.WorldModel = "models/weapons/w_kampflanze.mdl"
else
SWEP.WorldModel = "models/weapons/w_kampflanze2.mdl"
end


macht das Problem. Ich vermute anhand der Fehlermeldung das man "Global" Variablen anscheinend nicht einfach wieder ändern kann.



if ( SERVER ) then

AddCSLuaFile( "shared.lua" )

SWEP.HoldType = "ar2"

end

local change = false

if ( CLIENT ) then

SWEP.PrintName = "Forcelance"
SWEP.Author = "Dunkelbier"
SWEP.Slot = 1
SWEP.SlotPos = 1
SWEP.Description = "The Forcelance from the Scifi-Series Andromeda"
SWEP.Purpose = ""
SWEP.Instructions = "Primary fire: Shoot / Fight \n\nSecondary Fire: Toggle Close combat / distance attack"

end

SWEP.Spawnable = true
SWEP.AdminSpawnable = true

SWEP.ViewModel = "models/weapons/v_kampflanze.mdl"
SWEP.WorldModel = "models/weapons/w_kampflanze.mdl"

SWEP.Weight = 5
SWEP.AutoSwitchTo = false
SWEP.AutoSwitchFrom = false

SWEP.Primary.Recoil = 2
SWEP.Primary.Damage = 0
SWEP.Primary.NumShots = 0
SWEP.Primary.Cone = 0
SWEP.Primary.ClipSize = 45
SWEP.Primary.Delay = 0.2
SWEP.Primary.DefaultClip = 900
SWEP.Primary.Automatic = true
SWEP.Primary.Ammo = "ar2"

SWEP.Secondary.Delay = 1
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = -1
SWEP.Secondary.Automatic = false
SWEP.Secondary.Ammo = "none"


/*---------------------------------------------------------
Primary Attack
---------------------------------------------------------*/
local Right = 3.5
local Forward = 14
local Up = -3.2
local Up2 = -3

local mode = 1
local pang = false


util.PrecacheSound("weapons/V_kampflanze/fire.wav")
util.PrecacheSound("weapons/V_kampflanze/reload.wav")
util.PrecacheSound("common/bugreporter_succeeded.wav")
util.PrecacheSound("npc/turret_floor/ping.wav")

function SWEP:Init()
mode = 1
self.Weapon:SetNetworkedBool( "mode1", true )

return true;
end

function SWEP:Think()
-- if change == false then
-- SWEP.WorldModel = "models/weapons/w_kampflanze.mdl"
-- else
-- SWEP.WorldModel = "models/weapons/w_kampflanze2.mdl"
--end
end

function SWEP:PrimaryAttack()

if (SERVER) then
local trace = self.Owner:GetEyeTrace()

if self.Weapon:Clip1() > 0 then
self:TakePrimaryAmmo( 1 )

self.Weapon:SendWeaponAnim( ACT_VM_PRIMARYATTACK )
self.Weapon:EmitSound("weapons/V_kampflanze/fire.wav")

local effectdata = EffectData()
effectdata:SetOrigin( trace.HitPos )
effectdata:SetNormal( trace.HitNormal )
effectdata:SetEntity( trace.Entity )
effectdata:SetAttachment( trace.PhysicsBone )
util.Effect( "selection_indicator", effectdata )

local effectdata = EffectData()
effectdata:SetOrigin( trace.HitPos )
effectdata:SetStart( self.Owner:GetShootPos() )
effectdata:SetAttachment( 1 )
effectdata:SetEntity( self.Weapon )
util.Effect( "ToolTracer", effectdata )

local delay = 0.2
self.Weapon:SetNextPrimaryFire(CurTime() + delay)

bullet = {}
bullet.Num=1
bullet.Src= self.Owner:GetShootPos()
bullet.Dir= self.Owner:GetAimVector()
bullet.Spread=Vector(0,0,0)
bullet.Tracer=1
bullet.Force=10
bullet.Damage= 10

self.Owner:FireBullets(bullet)
end
end
end

function SWEP:SecondaryAttack()
if change == false then

game.ConsoleCommand("cam_command 1\n")
game.ConsoleCommand("cam_idealyaw 0\n")
game.ConsoleCommand("cam_idealpitch 15\n")
self.Primary.Automatic = false
self.Weapon:SetNetworkedBool( "change", true )
change = true

else

game.ConsoleCommand("cam_command 2\n")
game.ConsoleCommand("cam_idealyaw 90\n")
game.ConsoleCommand("cam_idealpitch 0\n")
self.Primary.Automatic = true
self.Weapon:SetNetworkedBool( "change", false )
change = false
end

end

function SWEP:Deploy()
-- self.Owner:EmitSound("laser/dep.wav")

game.ConsoleCommand("cam_command 2\n")
game.ConsoleCommand("cam_idealyaw 90\n")
game.ConsoleCommand("cam_idealpitch 0\n")

return true;
end

function SWEP:Holster()
-- self.Owner:EmitSound("laser/holster.wav")

game.ConsoleCommand("cam_command 2\n")
game.ConsoleCommand("cam_idealyaw 90\n")
game.ConsoleCommand("cam_idealpitch 0\n")

return true;
end

function SWEP:Reload()
if change == false then
self.Weapon:DefaultReload( ACT_VM_RELOAD );
if self.Weapon:Clip1() < 45 and self:Ammo1() > 0 then
self.Weapon:EmitSound("weapons/V_kampflanze/reload.wav")
end
end
end

*DEAD*Pr0no0b
21.06.2007, 10:20
Hab oben was hinzugefügt, vielleicht hilfts ja^^


function SWEP:SecondaryAttack()
if change == false then

game.ConsoleCommand("cam_command 1\n")
game.ConsoleCommand("cam_idealyaw 0\n")
game.ConsoleCommand("cam_idealpitch 15\n")
self.Primary.Automatic = false
self.Weapon:SetNetworkedBool( "change", true )
change = true

else
if change == true then
game.ConsoleCommand("cam_command 2\n")
game.ConsoleCommand("cam_idealyaw 90\n")
game.ConsoleCommand("cam_idealpitch 0\n")
self.Primary.Automatic = true
self.Weapon:SetNetworkedBool( "change", false )
change = false
end


Vielleicht muss das so aussehen.

Dunkelbier
21.06.2007, 10:31
Also der Teil an den du was eingefügt hast funtioniert ja einwandfrei.

Deine idee von oben hat leider auchnicht funktioniert, da nach dem Doppelpunkt ja nur Funktionen aufgerufen werden und keine Variablen. Genauergesagt hat er wegen dem Punkt nach dem self.owner: nen fehler gezeigt und wenn ich self.owener:WorldModel schreibe sagt er nur das er die Funktion WorldModel nicht finden kann.

*DEAD*Pr0no0b
21.06.2007, 10:34
Wie ich schon sagte, ich kenn mich selber nicht damit aus.
Kannst ja mal gucken, ob aVon irgendwann mal wieder reinschaut ;D
Oder vielleicht kann Pac dir helfen.

Pac_187
21.06.2007, 12:40
Hier mal das Lua Script

Der unten deaktivierte Teil



if change == false then
SWEP.WorldModel = "models/weapons/w_kampflanze.mdl"
else
SWEP.WorldModel = "models/weapons/w_kampflanze2.mdl"
end




Setzte mal anstatt von SWEP, self ein, also dass das Ganze dann so aussieht



if ( change == false ) then
self.WorldModel = "models/weapons/w_kampflanze.mdl"
else
self.WorldModel = "models/weapons/w_kampflanze2.mdl"
end



Wenn das nicht funktioniert versuchst du mal folgendes:



if ( change == false ) then
self.Weapon:SetModel( "models/weapons/w_kampflanze.mdl" )
else
self.Weapon:SetModel( "models/weapons/w_kampflanze2.mdl" )
end



Ach und Pr0no0b, das was du da oben eingesetzt hast ist falsch, es müsste elseif ( if change == true ) then
heißen.
Und das mit den Consolecommands kannst du auch abkürzen indem du einfach alle hintereinander schreibst und sie mit einem
; trenst.

;)

Scarecrow
21.06.2007, 13:10
Ich hab da ne kurze Frage: Werden die Models bei SWEPs von selbst auf die PCs der Clienten geladen? Falls nicht, ist es notwendig vorher schon beide Models zu laden, anstatt nur eines, denn es könnte zu nem großen Error-Logo bei den Clienten kommen.

Pac_187
21.06.2007, 13:16
Ich hab da ne kurze Frage: Werden die Models bei SWEPs von selbst auf die PCs der Clienten geladen? Falls nicht, ist es notwendig vorher schon beide Models zu laden, anstatt nur eines, denn es könnte zu nem großen Error-Logo bei den Clienten kommen.

Models werden nie automatisch mit übertragen...
Sonst würde es ja Tage dauern bis man auf einem Server gejoint ist,
der ziemliche viele Custom SWEPs enthält, welche alle mit einem eigenen Model
versehen sind ;)


Was er allerdings noch in seiner SWEP machen kann, ist das er die die w_* Models
precached.


util.PrecacheModel( ".............." )

Scarecrow
21.06.2007, 13:19
...util.PrecacheModel( ".............." )

Ganz genau das meine ich! Ich habe es mir schon gedacht, dass man auch SWEP-Models precachen muss/kann. Was mir nicht klar war, ist, ob bei SWEPs alles von "selbst" passiert.

Ok, ich denke, dass ich mein Exosounds Projekt ein wenig verschiebe und stattdessen mich an SWEPs ranmache ;)

Dunkelbier
21.06.2007, 22:35
Beide Tips von dir Haben leider nicht Funktioniert - zwar geben die Befehle keine Fehlermeldung aber trotzdem ändert sich das Model nicht.

Scarecrow
22.06.2007, 06:35
Beide Tips von dir Haben leider nicht Funktioniert - zwar geben die Befehle keine Fehlermeldung aber trotzdem ändert sich das Model nicht.

Versuche das Ganze irgendwie auf Clientbasis zu aktualisieren. Ich wüsste jetzt nicht wie, aber das muss doch gehn, als würde man eine Waffe switchen.

Dunkelbier
22.06.2007, 18:41
Hi! Hab hier mal nen Video meiner Waffe - da kann man dann auch sehen wo mein Problem liegt oder was ich vor habe.

http://video.google.de/videoplay?docid=5696404395159122955&q=andromeda+forcelance&total=1&start=0&num=10&so=0&type=search&plindex=0

Scarecrow
22.06.2007, 19:26
Hmm... also wenn sich das nicht ändert heisst das, dass durch das Festlegen des Models irgendwo das Ganze beim Aufrufen der SWEP permanent festgelegt wird. Theoretisch müsstest du den Umstand machen, die Waffe per Rechtsklick zu löschen und die neue Waffe zu erhalten, also 2 SWEPs, die man nicht gleichzeitig haben kann.

Ein World Model Change in deinem Sinne funktioniert nicht, weil die Funktion nicht dynamisch ist.

Dunkelbier
22.06.2007, 19:38
Also hat man das anscheinen beim Programmieren von GMod nicht berücksichtig, da es ja bei CSS M4 und USP funktioniert. Ich müsste da wohl mal direkt bei "Garry" nachfragen :-)

Scarecrow
23.06.2007, 16:12
Also hat man das anscheinen beim Programmieren von GMod nicht berücksichtig, da es ja bei CSS M4 und USP funktioniert. Ich müsste da wohl mal direkt bei "Garry" nachfragen :-)

Ganz genau! Ich denke, dass diese Authorisierungsfunktion für Models nicht sehr dynamisch ist, was aber nicht heisst, dass es unmöglich ist. Du könntest einerseits bei Garry fragen, andererseits im FP nach passenden DLLs suchen.