Seite 1 von 3

ListIndex bzw allgemeines Verständisproblem [gelöst]

Verfasst: 11.06.2006 15:24
von cofter
Hi,
ich lege mit NewList PLayerS.PlayerData() eine neue Liste an.
Füge ein Element hinzu AddElement(PlayerS()) und weise diesem einen Wert zu PlayerS()\PlayerID = ClientID.
Jetzt habe ich in meiner Structure noch PlayerIndex und möchte den ListIndex darim speichern.
Ich dachte mir das mach ich so.

Code: Alles auswählen

 ForEach PlayerS() 
     PlayerS()\Index = ListIndex(PlayerS())
 Next
Irgendwie kommt aber immer 0 bei raus. :?

Das ganze habe ich in eine Procedure gepackt die eigentlich einen neuen PlayerS()\PlayerID erstellt wenn jemand auf den Server connected.
Will leider nicht so funktionieren wie ich mir das gedacht habe.
Könnte mir jemand ein wenig auf die Sprünge helfen? :)
Habe jetzt schon mehrere Möglichkeiten versucht darum siehts etwas chaotisch aus.

Code: Alles auswählen

Procedure recieve_all()
  *Buffer = AllocateMemory(3072) 
  Global SEvent = NetworkServerEvent()
  ExamineIPAddresses()

  If SEvent
    Global ClientID = EventClient()
    
    Select SEvent    
      Case 1
        Global NewList PlayerS.PlayerData()
        AddElement(PlayerS())    
        PlayerS()\PlayerID = ClientID 
        
        ForEach PlayerS() 
         PlayerS()\Index = ListIndex(PlayerS())
        Next

        Global CountList = CountList(PlayerS())     
        AddGadgetItem(#ConsoleEditorGadged,a,"Neuer Client Connectet! " +Str(PlayerS()\PlayerID) +Chr(13))
        AddGadgetItem(#ConsoleEditorGadged,a,"PlayerIndex " +Str(PlayerS()\Index) +Chr(13))
        
        ;AddGadgetItem(#ConsoleEditorGadged,a,"ListenID: " +Str(ListCount)+ Chr(10))
      Case 2
        ReceiveNetworkData(PlayerS()\PlayerID, *Buffer, 3072)
        neuText.s = PeekS(*Buffer)
        
        Global username.s = StringField(neuText.s, 1, ";")
        Global password.s = StringField(neuText.s, 2, ";")
        
        SQL_Login(username.s,password.s,ClientID)
      Case 3
        SetGadgetText(#ConsoleEditorGadged,"Client " +Str(PlayerS()\PlayerID)+ " versucht Datei zu schicken!"+ Chr(10))
      Case 4
        AddGadgetItem(#ConsoleEditorGadged,a,"Client " +Str(PlayerS()\PlayerID)+ " verlässt den Server"+ Chr(10))
        AddGadgetItem(#ConsoleEditorGadged,a,"ListenID: " +Str(count)+ Chr(10))
        AddGadgetItem(#ConsoleEditorGadged,a,"PlayerIndex: " +Str(PlayerS()\Index)+ Chr(10))
        
        
        count.l = CountGadgetItems(#ListPlayer) - 1
        ForEach PlayerS()
          For i = 0 To count
            If acc_name = GetGadgetItemText(#ListPlayer, i, 0)
              RemoveGadgetItem(#ListPlayer, i)
              count - 1
              Break
            EndIf
          Next i  
        Next 
            
        If ListCount_out = 0
          AddGadgetItem(#ConsoleEditorGadged,a,"Es ist niemand Online"+ Chr(10))
        Else
          AddGadgetItem(#ConsoleEditorGadged,a,"Es sind noch "+Str(ListCount_out)+" Player in der Liste"+ Chr(10))
        EndIf
    
    EndSelect
  EndIf
mfg
Cofter

Verfasst: 11.06.2006 15:28
von Jilocasin
Gugg mal..

Code: Alles auswählen

...
Select SEvent   
  Case 1 
    Global NewList PlayerS.PlayerData()
    AddElement(PlayerS())...
Du erstellst jedes Mal eine neue (leere) Liste! :wink:

Verfasst: 11.06.2006 15:32
von mk-soft
Beispiel:

Code: Alles auswählen

Structure udtTest
  index.l
EndStructure

; Nicht in einer Procedure
Global NewList test.udtTest()

For i = 0 To 9
  AddElement(test())
Next

ForEach test()
  test()\index = ListIndex(test())
Next 

ForEach test()
  Debug test()\index
Next 
FF :wink:

Verfasst: 11.06.2006 15:54
von cofter
Ja danke.
Das mit dem Index funktioniert jetzt wie geplant. :)
Leider hapert es noch die User aus der Liste zu entfernen wenn diese wieder disconnecten.
Wenn 3 User online sind nimmt er den letzten egal wer disconnected und die letzten beiden werden garnet aus der Liste entfernt.

Verfasst: 11.06.2006 16:01
von Kaeru Gaman
dann musst du ERST das richtige element auswählen, dann löschen...

[edit]

Code: Alles auswählen

ForEach Player()
  If Player()\connected = #False
    DeleteElement Player()
  EndIf
Next

Verfasst: 11.06.2006 17:52
von cofter
Na ja, es geht in erster Linie darum das jeweilige Nick aus der Liste genommen wird welcher disconnected hat.
Ich weiss nicht wie ich das machen soll. :?
Ich müsste irgendwie das richtige Element in PlayerS()\PlayerName bekommen.
PlayerS()\PlayerName enthält ja immer das zuletzt hinzugefügte.
Wie filter ich den richtigen Namen jetzt wieder aus? 0_o

@Kaeru Gaman
Sorry mit dem Snippet kann ich grad garnix anfangen.
Bin heute anscheinend schwer von Begriff. :-/

Ich zeige euch mal meinen derzeitigen Code dazu
(Unwichtige dinge habe ich mal entfernt)

Code: Alles auswählen

Procedure recieve_all()
  *Buffer = AllocateMemory(3072) 
  Global SEvent = NetworkServerEvent()
  ExamineIPAddresses()

  If SEvent
    Global ClientID = EventClient()
    
    Select SEvent    
      Case 1
       
        AddElement(PlayerS())    
        PlayerS()\PlayerID = ClientID 
        PlayerS()\PlayerName = acc_name
       
        ForEach PlayerS() 
            PlayerS()\Index = ListIndex(PlayerS())
        Next
        
        Global CountList = CountList(PlayerS()) -1   

      Case 2
        ReceiveNetworkData(PlayerS()\PlayerID, *Buffer, 3072)
        neuText.s = PeekS(*Buffer)
        
        Global username.s = StringField(neuText.s, 1, ";")
        Global password.s = StringField(neuText.s, 2, ";")
        
        SQL_Login(username.s,password.s,ClientID)
      Case 3
        SetGadgetText(#ConsoleEditorGadged,"Client " +Str(PlayerS()\PlayerID)+ " versucht Datei zu schicken!"+ Chr(10))
      Case 4
       
        
        count.l = CountGadgetItems(#ListPlayer) - 1
       
        ForEach PlayerS()
          For i = 0 To count
            If PlayerS()\PlayerName = GetGadgetItemText(#ListPlayer, i, 0)
              RemoveGadgetItem(#ListPlayer, i)
              count - 1
              Break
            EndIf
          Next i 
        Next 
 
        If ListCount_out = 0
          AddGadgetItem(#ConsoleEditorGadged,a,"Es ist niemand Online"+ Chr(10))
        Else
          AddGadgetItem(#ConsoleEditorGadged,a,"Es sind noch "+Str(ListCount_out)+" Player in der Liste"+ Chr(10))
        EndIf
    
    EndSelect
  EndIf
FreeMemory(*Buffer)
EndProcedure

Verfasst: 11.06.2006 18:07
von mk-soft
Versuchs mal so

Code: Alles auswählen

; Disconnect
    ForEach PlayerS()
      If PlayerS()\PlayerID = ClientID
        DeleteElement(PlayerS())
        Break
      EndIf
    Next
FF :wink:

Verfasst: 11.06.2006 18:52
von cofter
Hm, also das macht aber nicht das was ich möchte.
Dieses löscht ja auch nur das letzte Element was hinzugefügt wurde.
*shame on me*

Verfasst: 11.06.2006 19:56
von mk-soft
Bei mir funktioniert es. Kann es sein das der letzte der sich angemeldet hat sich auch als erstes abmeldet. Dann ist es richtig das das letzte element auch entfernt wird.

FF

Verfasst: 11.06.2006 20:22
von cofter
Ja funktionieren tut es aber ich möchte doch einträge aus einer ListViewGadget entfernen.
Glaube ich habe mich wohl irgendwo nicht ganz klar ausgedrückt.

Ich habe ein Interface... EditorGagdget und ein ListViewGadget sobald sich jemand zu meinem Server verbindet kommt eine Meldung im EditorGadget.
Beim User kommt ein Loginfenster wo er sich einloggen soll Username und Password werden zum Server übermittelt. Es wird dann überprüft ob Username und Password richtig sind (MySQL abfrage) stimmen diese wird ein Eintrag ins ListViewGadget mit dem Usernamen getätigt.
Wenn der User aber jetzt wieder disconnected dann soll der jeweilige Eintrag auch wieder entfernt werden.
Mein Problem ist jetzt die Position im ListViewGadget ausfindig zu machen damit der Richtige Eintrag entfernt wird.

mfg
Cofter