+ Antworten
Ergebnis 1 bis 10 von 10
  1. #1
    Creeper-Jäger Avatar von neocromicon
    Registriert seit
    12.01.2011
    Beiträge
    405
    Minecraft
    neocromicon

    EntityPlayer setHealth(), komme nicht weiter

    Hi,

    ich bin seit Wochen am verzweifeln.
    Ich möchte dem Spieler bei zuviel Genuss von Bier sterben lassen, klingt erstmal einfach aber es geht einfach nicht.
    Ich kann ihm zwar Schaden zufügen und auch Sterben lassen aber das ist alles nur Fake, nach 2-3 Sek hat der Spieler wieder volle Herzen und beidem Tot kann man nicht Respawn drücken.

    Ich hatte vor einer ganzen weile erfahren das ich das dem Server mitteilen muss, also habe ich mir das Packet Tut auf minecraftforge.net durchgelesen aber es bringt genau die gleichen Ergebnisse.

    Hier noch die Codes die ich bereits verwendet hatte:
    Code:
    entityplayer.setEntityHealth((entityplayer.getHealth()-20));
    entityplayer.setEntityHealth(0);
    FMLClientHandler.instance().getClient().thePlayer.attackEntityFrom(DamageSource.causePlayerDamage(entityplayer), 10);
    FMLClientHandler.instance().getClient().thePlayer.setEntityHealth((entityplayer.getHealth()-20));
    mfg


  2. #2
    Creeper-Jäger Avatar von Gnoccy
    Registriert seit
    25.12.2010
    Beiträge
    443
    Minecraft
    Gnoccy
    mit
    Code:
    player.setEntityHealth(player.getHealth() - 1);
    funktioniert es auf jeden Fall. Ich verwende das selbe in meinem aktuellem Projekt. Ich vermute den Fehler deshalb eher in der Datenübermittlung zum Server. Kannst du mal den entsprechenden Code posten?

  3. #3
    Creeper-Jäger Avatar von neocromicon
    Registriert seit
    12.01.2011
    Beiträge
    405
    Minecraft
    neocromicon
    @Gnoccy


    Der "DrunkLevel" Code ist noch lange nicht final, aber ich komme halt an der besagten stelle nicht weiter
    Geändert von neocromicon (08.12.2012 um 23:48 Uhr)


  4. #4
    Creeper-Jäger Avatar von Gnoccy
    Registriert seit
    25.12.2010
    Beiträge
    443
    Minecraft
    Gnoccy
    Also wenn ich das richtig sehe ist das Problem, dass der Code nur Clientseitig ausgefürht wird. Du musst ein Packet zum Server senden, dass dem Server sagt, dass es den Spieler verletzen soll.
    In wie weit hast du dich mit dem Thema schon auseinander gesetzt? Wenn man es erst einmal verstanden hat ist es nicht wirklich schwer.

  5. #5
    Creeper-Jäger Avatar von neocromicon
    Registriert seit
    12.01.2011
    Beiträge
    405
    Minecraft
    neocromicon
    @Gnoccy
    Ich habe mich an dieses:
    http://www.minecraftforge.net/wiki/T...acket_Handling Tutorial gehalten.

    Wie gesagt gebracht hat es reichlich wenig . So richtig auseinander gesetzt habe ich mich damit nie. Wenn du also weist wie es funktioniert wäre ich dir echt dankbar.
    Geändert von neocromicon (09.12.2012 um 00:24 Uhr)


  6. #6
    Creeper-Jäger Avatar von Gnoccy
    Registriert seit
    25.12.2010
    Beiträge
    443
    Minecraft
    Gnoccy
    Also an der stelle
    Code:
    entityplayer.setEntityHealth((entityplayer.getHealth()-20));
    musst du prüfen, oder der Code gerade auf dem Client, oder auf dem Server ausgefürht wird. Das machst du zum Beispiel mit
    Code:
    if(world.isRemote){}
    Liefert dies Abfrage true, bist du auf dem Client und musst ein Packet an dern Server schicken. Liefert sie false bist du auf dem Server und kannst deinen Code wie gehabt ausführen.
    Wie man ein Packet baut, verschickt und auswertet weist du? Falls nicht meld dich nochmal.

    Ich werde gleich erstmal ein wenig lol zocken. Wenn du also noch Fragen hast, dann stell sie jetzt, ich denke ich werde in etwa eine viertel Stunde weg sein.
    Geändert von Gnoccy (09.12.2012 um 00:37 Uhr)

  7. #7
    Creeper-Jäger Avatar von neocromicon
    Registriert seit
    12.01.2011
    Beiträge
    405
    Minecraft
    neocromicon
    @Gnoccy
    So habe gerade isRemote ausprobiert, da ich das mit deiner Abfrage nicht ganz verstehe gebe ich dir nochmal den Code, jedenfalls spuckt er mir bei if(var2....) die Consolen Nachricht aus, ich nehme mal an das meinst du mit true.

    Code:
    if (DrunkLevelBlack == 8)
        { 	
    		if(var2.isRemote)
    	    {
    	    	System.out.println("if");
    	    	entityplayer.setEntityHealth((entityplayer.getHealth()-20));
    	    }
    	    else
    	    {
    	    	System.out.println("else");
    	    	//entityplayer.setEntityHealth((entityplayer.getHealth()-20));
    	    }
    		System.out.println("4");
            //entityplayer.setEntityHealth((entityplayer.getHealth()-20));
    		entityplayer.addChatMessage("Stay safe drinking water!");
        	DrunkLevelBlack = 0;
        }
    Console:
    Code:
    2012-12-09 01:36:52 [INFO] [STDOUT] if
    Und nein wie gesagt habe nur dieses Tut von minecraforge.net befolgt, aber verstanden habe ich es ehrlich gesagt nicht . Bin halt ein mensch der von Theorie nicht viel lernt, deshalb kann ich auch nix mit den ganzen "Fachbegriffen" anfangen. (Das läuft in meinem Kopf vollkommen anders ab als bei anderen)
    Geändert von neocromicon (09.12.2012 um 00:45 Uhr)


  8. #8
    Creeper-Jäger Avatar von Gnoccy
    Registriert seit
    25.12.2010
    Beiträge
    443
    Minecraft
    Gnoccy
    Hast du Skype? Dann erkläre ich es dir eben schnell.

  9. #9
    ♫ ٩(͡๏̯͡๏)۶ ♪ Avatar von pitman-87
    Registriert seit
    10.01.2011
    Beiträge
    1.597
    Wie Gnoccy schon meinte wird die Funktion im Server nicht aufgerufen und da sowas wie Gesundheit und Tot sich im Server abspielen, wird der neue Zustand jedes vom alten überschrieben (beim synchronisieren zwischen Server und Client).

    Also alle Klassen (Modklasse, entities, items, blöcke) solltest du in den common-Ordner packen (server + cient).
    Alles was nur clientseitig gebraucht wird in den minecraft-ordner (Renderer, GUI, Modelle usw)

  10. #10
    Creeper-Jäger Avatar von neocromicon
    Registriert seit
    12.01.2011
    Beiträge
    405
    Minecraft
    neocromicon
    @pitman-87

    Danke noch für den letzten hinweis, aber Gnoccy hat mir sehr gut in Skype weiter geholfen. Mittlerweile funktioniert alles super und ich habe auch verstanden was da passiert .

    Kann also im Prinzip geschlossen werden.

    mfg


+ Antworten