Résolu Spawn d'un entity buguer
-
Salut,
Je suis en train de crée un système de “vieillissement” de l’entity, et a un moment, je veux quelle mette bas un petit, pour cela :
public void onUpdate() { super.onUpdate(); int s = 20; int m = 1200; EntityMobBouftonBlanc entityboufton = new EntityMobBouftonBlanc(worldObj); entityboufton.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rand.nextFloat() * 360.0F, 0.0F); if (this.worldObj.isRemote) { if (this.getAge() % m == 0) // Vieillissement { mobSizeOld *= 1.1F; System.out.println("veillit"); } if (this.getAge() % 200 == 0) // naissance { System.out.println("naissance"); this.worldObj.spawnEntityInWorld(entityboufton); } } }
Le petit spawn bien, mais buguer, il ne bouge pas, on ne peut pas l’attaquer, il ne fait rien…
Une idée ?
Ce la viens surment du world.isremote, mais le soucis c’est que sans ça, le getAge() ne fonctionne plus…
-
J’ai eu le même soucis pour mes spawns de monture et j’ai résolu ça par un paquet. En gros ton entité existe coté client et pas serveur.
-
Ok, merci, je suis assez novice avec les paquets.
Mais bon, en théorie, je dois fait quoi ? Dire au serveur que l’entité a été crée ? Comment ?
-
if (this.worldObj.isRemote) -> if (!this.worldObj.isRemote)
worldObj.isRemote = world client
!worldObj.isRemote = world server
Le spawn des entités doit être fait côté serveur. -
Merci, mais le soucis c’est que ducoup,
if (!this.worldObj.isRemote) { if (this.getAge() % vieillesse == 0) // Vieillissement { mobSizeOld *= 1.1F; System.out.println("veillit"); } if (this.getAge() % naissance == 0) // naissance { this.worldObj.spawnEntityInWorld(entityboufton); System.out.println("naissance"); } if (this.getAge() % mort == 0) // Meurt { this.setHealth(0.0F); System.out.println("meurt"); } }
Toute les actions : vieillesse, naissance, meut, s’execute en même temps ^^’ Les conditions du this.getAge() sont tous ignorer.
-
Fait un print de this.getAge() ?
ÉDIT : au pire si tu as vraiment besoin des paquets :
Mais bon, je ne suis pas sûr qu’utiliser les paquets dans ce contexte soit une bonne idée. -
Attention… ANARCHIE !
[11:30:44] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 2 [11:30:44] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 0 [11:30:44] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 4 [11:30:44] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 2 [11:30:44] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 4 [11:30:44] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 6 [11:30:44] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 6 [11:30:44] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 8 [11:30:44] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 8 [11:30:44] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 10 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 10 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 12 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 12 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 14 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 14 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 16 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 16 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 18 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 18 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 20 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 20 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 22 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 22 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 24 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 24 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 26 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 28 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 26 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 30 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 28 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 32 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 30 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 34 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 32 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 36 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 34 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 38 [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 40 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 36 [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 38
Il envoie aussi aux client et aucune condition n’est respecter, il execute les 3 d’un coup. (enfin, casiement, en 40 ticks quoi ^^)
EDIT : les paquets me servirons un jour de toute façon, mais c’est vrai que pour là, il ne devrais pas y en avoir besoin, enfin je l’espers…
EDIT2 : en faite il envoie bien au serveur, j’avais pas mit le truc au bon endroit… mais les condition…
-
C’est étrange car comme tu peux le voir que ce soit côté client / serveur dans les deux cas la variable ne vaut pas 0.
Si tu fais un print de this.getAge() % mort == 0 ? -
Elle est initialisé a “true”
Pourtant, mort est égal a 2400 ticks
Edit : Ha, je crois que j’ai compris, en faite le getAge() bouge que quand le mob est en mouvement, sinon, elle repasse a 0 !
Edit 2 : C’est bon !
public void onUpdate() { super.onUpdate(); int s = 20; int m = 1200; int h = 72000; int j = 1728000; int vieillesse = s*5;//h*4; int naissance = s*30;//h*18; int mort =m;//j*2; EntityMobBouftonBlanc entityboufton = new EntityMobBouftonBlanc(this.worldObj); entityboufton.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rand.nextFloat() * 360.0F, 0.0F); if (this.worldObj.getTotalWorldTime() % 1 == 0) { vie ++; System.out.println(vie); } if (this.worldObj.isRemote) { if (this.vie % vieillesse == 0) // Vieillissement { mobSizeOld *= 1.1F; System.out.println("veillit"); } } if (!this.worldObj.isRemote) { if (this.vie == naissance) // naissance { this.worldObj.spawnEntityInWorld(entityboufton); System.out.println("naissance"); } if (this.vie == mort) // Meurt { this.setHealth(0.0F); System.out.println("meurt"); } }
Vue que le getAge() ne folnctionnais que quand l’entité marchait, et qu’elle repassais a 0, c’etait pas bon !
Du coup j’ai crée une variable “vie” qui aumente de 1 a chaque tick du monde. Ducoup, tout fonctionne correctement !
Merci Robin ne m’avoir mit sur cette piste !