CbC: Feedback-Thread

Hier geht es um technische Fragen zu Fantasya.
Benutzeravatar
nemo
Heerführer
Beiträge: 232
Registriert: Mi 25. Feb 2015, 12:06

CbC: Feedback-Thread

Beitrag von nemo » Di 21. Feb 2017, 16:17

Moin!
Wenn Ihr beim Ausführen eine Fehlermeldung bekommt, kopiert sie hier bitte rein.
Wenn Ihr sonst unvorhergesehenes Verhalten feststellt (== Wenn ein Meta nicht das bewirkt, was oben in der Doku steht), beschreibt bitte den Fall.
Wenn Euch zu einem Skript eine elegantere Programmierlösung einfällt: Gerne, danke!

Wenn Ihr Vorschläge für neue Funktionalitäten habt, diese bitte dort rein:
http://forum.fantasya-pbem.de/viewtopic.php?f=7&t=194

Code-Thread:
http://forum.fantasya-pbem.de/viewtopic.php?f=7&t=192
Dokumentation-Thread:
http://forum.fantasya-pbem.de/viewtopic.php?f=7&t=193

Changelog (letzter Eintrag)
19. März 2017
- Neues getimetes Meta: +route. Koppelt das Setzen von Bewegungsbefehlen an eine Kontrolle der Koordinaten, auf denen die Einheit gerade steht. Bei Schiffen mit Sturmtreffern weniger fummelig als der Fantasya-Befehl ROUTE, generell für alles geeignet, was sich bewegen soll.
-- neues Skript: route(Unit)
Zuletzt geändert von nemo am So 19. Mär 2017, 14:45, insgesamt 15-mal geändert.
I may go pop -- Excuse me!

Benutzeravatar
nemo
Heerführer
Beiträge: 232
Registriert: Mi 25. Feb 2015, 12:06

CbC: Bekannte Probleme

Beitrag von nemo » Di 21. Feb 2017, 20:45

- +lerne und +lernen scheinen sich gegenseitig zu beeinflussen: ist bei mir jdfls aufgetaucht, dass eine Einheit mit +lerne x und +lernen x folgebefehl auf einmal "folgebefehl ; ersatzweise" drinstehen hatte.
-- geplante Lösung: Zusammenlegung vvon +lernen und +anlernen

- Metabefehele als Alternativbefehle bei harten Metas: Führen zur Verweigerung einer Abführungs ans Lager;

??? - +gib funktioniert nicht immer (nur meistens); ???
[Kann auch sein, dass ich da noch Kommas aus der alten Version übrig hatte :oops: ]
??? - +lehre: Lehrer versuchen, bereits lehrende Lehrer zu lehren;???
(as of Mar/14: konnte nicht nochmals beobachtet werden)

- +lernen und +anlernen nehmen nichts an, was Umlaute oder ß enthält, +lerne und +lehre ist es dafür völlig egal, ob ihre Angegebenen Talente überhaupt existieren

- Der "Programmierer" ist ein verdammter Amateur
Zuletzt geändert von nemo am So 19. Mär 2017, 14:47, insgesamt 21-mal geändert.
I may go pop -- Excuse me!

Benutzeravatar
Thalian
Administrator
Beiträge: 653
Registriert: Mo 5. Jan 2015, 14:25
Kontaktdaten:

Re: Command By Comments

Beitrag von Thalian » Mi 22. Feb 2017, 08:16

getMaintenance() not found - sagt Dir das was?

Code: Alles auswählen

Fehler bei der Ausführung

Sourced file: inline evaluation of: ``import magellan.client.*; import magellan.client.extern.*; import magellan.libra . . . '' : Error in method invocation: Method getMaintenance() not found in class'magellan.library.rules.BuildingType'


Sourced file: inline evaluation of: ``import magellan.client.*; import magellan.client.extern.*; import magellan.libra . . . '' : Error in method invocation: Method getMaintenance() not found in class'magellan.library.rules.BuildingType' : at Line: 927 : in file: inline evaluation of: ``import magellan.client.*; import magellan.client.extern.*; import magellan.libra . . . '' : .getMaintenance ( ) 

	at bsh.BSHPrimarySuffix.doName(Unknown Source)
	at bsh.BSHPrimarySuffix.doSuffix(Unknown Source)
	at bsh.BSHPrimaryExpression.eval(Unknown Source)
	at bsh.BSHPrimaryExpression.eval(Unknown Source)
	at bsh.BSHBinaryExpression.eval(Unknown Source)
	at bsh.BSHBinaryExpression.eval(Unknown Source)
	at bsh.BSHIfStatement.evaluateCondition(Unknown Source)
	at bsh.BSHIfStatement.eval(Unknown Source)
	at bsh.BSHBlock.evalBlock(Unknown Source)
	at bsh.BSHBlock.eval(Unknown Source)
	at bsh.BSHBlock.eval(Unknown Source)
	at bsh.BSHIfStatement.eval(Unknown Source)
	at bsh.BSHBlock.evalBlock(Unknown Source)
	at bsh.BSHBlock.eval(Unknown Source)
	at bsh.BSHBlock.eval(Unknown Source)
	at bsh.BSHEnhancedForStatement.eval(Unknown Source)
	at bsh.BSHBlock.evalBlock(Unknown Source)
	at bsh.BSHBlock.eval(Unknown Source)
	at bsh.BshMethod.invokeImpl(Unknown Source)
	at bsh.BshMethod.invoke(Unknown Source)
	at bsh.BshMethod.invoke(Unknown Source)
	at bsh.Name.invokeLocalMethod(Unknown Source)
	at bsh.Name.invokeMethod(Unknown Source)
	at bsh.BSHMethodInvocation.eval(Unknown Source)
	at bsh.BSHPrimaryExpression.eval(Unknown Source)
	at bsh.BSHPrimaryExpression.eval(Unknown Source)
	at bsh.BSHBlock.evalBlock(Unknown Source)
	at bsh.BSHBlock.eval(Unknown Source)
	at bsh.BSHBlock.eval(Unknown Source)
	at bsh.BSHIfStatement.eval(Unknown Source)
	at bsh.BSHBlock.evalBlock(Unknown Source)
	at bsh.BSHBlock.eval(Unknown Source)
	at bsh.BSHBlock.eval(Unknown Source)
	at bsh.BSHEnhancedForStatement.eval(Unknown Source)
	at bsh.BSHBlock.evalBlock(Unknown Source)
	at bsh.BSHBlock.eval(Unknown Source)
	at bsh.BshMethod.invokeImpl(Unknown Source)
	at bsh.BshMethod.invoke(Unknown Source)
	at bsh.BshMethod.invoke(Unknown Source)
	at bsh.Name.invokeLocalMethod(Unknown Source)
	at bsh.Name.invokeMethod(Unknown Source)
	at bsh.BSHMethodInvocation.eval(Unknown Source)
	at bsh.BSHPrimaryExpression.eval(Unknown Source)
	at bsh.BSHPrimaryExpression.eval(Unknown Source)
	at bsh.BSHBlock.evalBlock(Unknown Source)
	at bsh.BSHBlock.eval(Unknown Source)
	at bsh.BSHBlock.eval(Unknown Source)
	at bsh.BSHEnhancedForStatement.eval(Unknown Source)
	at bsh.BSHBlock.evalBlock(Unknown Source)
	at bsh.BSHBlock.eval(Unknown Source)
	at bsh.BshMethod.invokeImpl(Unknown Source)
	at bsh.BshMethod.invoke(Unknown Source)
	at bsh.BshMethod.invoke(Unknown Source)
	at bsh.Name.invokeLocalMethod(Unknown Source)
	at bsh.Name.invokeMethod(Unknown Source)
	at bsh.BSHMethodInvocation.eval(Unknown Source)
	at bsh.BSHPrimaryExpression.eval(Unknown Source)
	at bsh.BSHPrimaryExpression.eval(Unknown Source)
	at bsh.Interpreter.eval(Unknown Source)
	at bsh.Interpreter.eval(Unknown Source)
	at bsh.Interpreter.eval(Unknown Source)
	at magellan.plugin.extendedcommands.ExtendedCommands.runExecute(ExtendedCommands.java:504)
	at magellan.plugin.extendedcommands.ExtendedCommands.execute(ExtendedCommands.java:480)
	at magellan.plugin.extendedcommands.ExtendedCommands.execute(ExtendedCommands.java:450)
	at magellan.plugin.extendedcommands.ExecutionThread.run(ExecutionThread.java:81)

Benutzeravatar
nemo
Heerführer
Beiträge: 232
Registriert: Mi 25. Feb 2015, 12:06

Re: Command By Comments

Beitrag von nemo » Mi 22. Feb 2017, 09:45

Moin!

Das geht ja gut los... Vielen Dank für's Testen und Melden :D

Also: Zeilen 927f befassen sich mit dem Gebäude-Unterhalt (was durch Buildingtype.getMaintenance() abgefragt wird).
Die Schlechte Nachricht ist: Ich habe keine Ahnung, warum das auf einmal nicht funktionieren sollte (bei mir läuft's jedenfalls).

Die guten Nachrichten sind:
1. Diese Funktion taucht nur in diesen beiden Zeilen auf;
2. Für Übergangsweise hab ich nen schnellen Patch hingeworfen (wenn das bei noch mehr Leuten auftaucht, bzw. anders nicht lösbar ist, bau ich den dauerhaft ein):

Hierfür ersetze man die Zeilen 927 und 928
(Bzw: Diese beiden:

Code: Alles auswählen

   if (unit.getBuilding() != null && unit == unit.getBuilding().getOwnerUnit() && unit.getBuilding().getType().getMaintenance() > 0){
    futter = futter + unit.getBuilding().getType().getMaintenance();
)

durch folgende:

Code: Alles auswählen

   if (unit.getBuilding() != null && unit == unit.getBuilding().getOwnerUnit() && buildingMaintenances.keySet().contains(unit.getBuilding().getType().toString())){
    futter = futter + buildingMaintenances.get(unit.getBuilding().getType().toString());
Und füge Folgendes in die Bibliothek ein (empfohlenerweise unter "Allgemeine Hilfsfunktionen")

Code: Alles auswählen

HashMap buildingMaintenances = new HashMap();
buildingMaintenances.put("Bergwerk", 100);
buildingMaintenances.put("Hafen", 100);
buildingMaintenances.put("Holzfällerhütte", 50);
buildingMaintenances.put("Leuchtturm", 100);
buildingMaintenances.put("Mine", 50);
buildingMaintenances.put("Monument", 100);
buildingMaintenances.put("Sägewerk", 100);
buildingMaintenances.put("Sattlerei", 100);
buildingMaintenances.put("Schiffswerft", 100);
buildingMaintenances.put("Schmiede", 100);
buildingMaintenances.put("Seehafen", 300);
buildingMaintenances.put("Steg", 30);
buildingMaintenances.put("Steinbruch", 100);
buildingMaintenances.put("Steingrube", 50);
buildingMaintenances.put("Steuerturm", 50);
buildingMaintenances.put("Werkstatt", 100);
(Disclaimer: Die Zahlen hab ich aus dem Wiki..und wo wir gerade dabei sind: Im Text zur Mine steht was von "Bergwerk" :) )

Auf der Suche nach dem Ursprung des Fehlers:
1. Welche Magellan-Version hast Du? Direkt von log-out oder die veränderte von Hamilcar?
2. Magst Du mal einer Einheit in einem Gebäude folgendes Skript geben, ausführen und mir hier reinkoperen, was sie danach ausspuckt?

Code: Alles auswählen

for(methode : unit.getBuilding().getType().getClass().getMethods()){
 helper.addOrder(unit, "; "+methode.toString());
}
(Das Skript kann danach natürlich wieder raus)
Zuletzt geändert von nemo am Mi 22. Feb 2017, 20:39, insgesamt 1-mal geändert.
I may go pop -- Excuse me!

Benutzeravatar
Kombinat
Oberst
Beiträge: 140
Registriert: Mo 26. Jan 2015, 21:48

Re: Command By Comments

Beitrag von Kombinat » Mi 22. Feb 2017, 17:04

Dank dir für deine Mühen.
Ich hab das mal bei mir installiert und ein paar erste Befehle getestet, noch läuft es, war aber auch noch nichts komplexes dabei. Ich schaue mal das ich die Tage soweit möglich alles umstelle von Forlage auf CbC, ich melde mich dann bei Fehlern :)

Benutzeravatar
Thalian
Administrator
Beiträge: 653
Registriert: Mo 5. Jan 2015, 14:25
Kontaktdaten:

Re: Command By Comments

Beitrag von Thalian » Mi 22. Feb 2017, 19:22

Was den "Fix" angeht... Jetzt habe ich andere Fehler. Ich schreibe Dir dazu eine PN.
Mit dem korrigierten Fix geht es nun.
nemo hat geschrieben: Auf der Suche nach dem Ursprung des Fehlers:
1. Welche Magellan-Version hast Du? Direkt von log-out oder die veränderte von Hamilcar?
2. Magst Du mal einer Einheit in einem Gebäude folgendes Skript geben, ausführen und mir hier reinkoperen, was sie danach ausspuckt?

Code: Alles auswählen

for(methode : unit.getBuilding().getType().getClass().getMethods()){
 helper.addOrder(unit, "; "+methode.toString());
}
(Das Skript kann danach natürlich wieder raus)
1.
Ich nutze Magellan Version: 2.0.6 (build 473) / Original.

2.
Hier das Ergebnis für eine Einheit in einem Steinbruch:

Code: Alles auswählen

; public void magellan.library.rules.BuildingType.addRegionType(magellan.library.rules.RegionType)
; public java.util.Collection magellan.library.rules.BuildingType.regionTypes()
; public boolean magellan.library.rules.BuildingType.containsRegionType(magellan.library.rules.RegionType)
; public int magellan.library.rules.BuildingType.getSkillBonus(magellan.library.rules.SkillType)
; public void magellan.library.rules.BuildingType.setSkillBonus(magellan.library.rules.SkillType,int)
; public magellan.library.StringID magellan.library.rules.BuildingType.getID()
; public magellan.library.ID magellan.library.rules.BuildingType.getID()
; public void magellan.library.rules.ConstructibleType.addRawMaterial(magellan.library.Item)
; public magellan.library.Item magellan.library.rules.ConstructibleType.getRawMaterial(magellan.library.StringID)
; public java.util.Collection magellan.library.rules.ConstructibleType.getRawMaterials()
; public void magellan.library.rules.ConstructibleType.addMaintenance(magellan.library.Item)
; public java.util.Collection magellan.library.rules.ConstructibleType.getMaintenanceItems()
; public void magellan.library.rules.ConstructibleType.setBuildSkillLevel(int)
; public int magellan.library.rules.ConstructibleType.getBuildSkillLevel()
; public void magellan.library.rules.ConstructibleType.setMaxSize(int)
; public int magellan.library.rules.ConstructibleType.getMaxSize()
; public magellan.library.Item magellan.library.rules.ConstructibleType.getMaintenance(magellan.library.ID)
; public java.lang.String magellan.library.impl.MagellanNamedImpl.getModifiedName()
; public java.lang.String magellan.library.impl.MagellanNamedImpl.toString()
; public java.lang.Object magellan.library.impl.MagellanNamedImpl.clone() throws java.lang.CloneNotSupportedException
; public java.lang.String magellan.library.impl.MagellanNamedImpl.getName()
; public void magellan.library.impl.MagellanNamedImpl.setName(java.lang.String)
; public int magellan.library.impl.MagellanIdentifiableImpl.superHashCode()
; public boolean magellan.library.impl.MagellanIdentifiableImpl.equals(java.lang.Object)
; public int magellan.library.impl.MagellanIdentifiableImpl.hashCode()
; public int magellan.library.impl.MagellanIdentifiableImpl.compareTo(java.lang.Object)
; public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
; public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
; public final void java.lang.Object.wait() throws java.lang.InterruptedException
; public final native java.lang.Class java.lang.Object.getClass()
; public final native void java.lang.Object.notify()
; public final native void java.lang.Object.notifyAll()

Benutzeravatar
Thalian
Administrator
Beiträge: 653
Registriert: Mo 5. Jan 2015, 14:25
Kontaktdaten:

Re: Command By Comments

Beitrag von Thalian » Do 23. Feb 2017, 09:54

So, ich habe getestet. Dabei habe ich Fehler mit +herde gefunden:

// +herde 0 Pferd
erzeugt:
Pferd
; Pruefzahl herde: 0 0

Analog auch mit Elefant - es fehlt das MACHE.

// +herde 0 Elefant MACHE Pferd
erzeugt:
Elefant MACHE Pferd
; Pruefzahl herde: 0 0

Was noch? Das Talent Bogenschießen (mit ß) kennt er nicht, eine kleine Unschönheit.

Und was mich schon immer gestört hat und was ich mir wünsche, ist ein automatisches FAULENZE auf See mit Deaktivierung des langen Befehls. Beispiel:
// +segeln LERNE Unterhaltung
erzeugt an Land "LERNE Unterhaltung" und auf See "FAULENZE".

Benutzeravatar
nemo
Heerführer
Beiträge: 232
Registriert: Mi 25. Feb 2015, 12:06

Re: Command By Comments

Beitrag von nemo » Do 23. Feb 2017, 13:27

Hello again
Thalian hat geschrieben:Das Talent Bogenschießen (mit ß) kennt er nicht, eine kleine Unschönheit.
... die leider beabsichtigt ist. Grund ist der Server, der Umlaute zwar annimmt, aber Umschreibungen zurück gibt. An sich erledigt sich das also nach der nächsten Auswertung von selbst, aber ich werd mal schauen, ob sich was machen lässt.
Thalian hat geschrieben:FAULENZE auf See mit Deaktivierung des langen Befehls
Wird gemacht.

Nachtrag zum Gebäude-Problem:
Das ist tatsächlich eine Kompatibilitäts-Sache zwischen Magellan und FMagellan. Ersteres verlangt für ConstructibleType.getMaintenance einen Parameter, letzteres nicht. Lösung: die Tabelle buildingMaintenances wird ab nächstem Update dauerhaft drin bleiben.

Input-Bitten:
Zum Thema Updates:
Ich hatte mir gedacht, einerseits wöchentlich gefixte Versionen rauszuhauen (sofern Fehler auffallen und ich zum reparieren gekommen bin, das ist), die auch schon neue Features enthalten können, andererseits, wenn es so lange ohne Fehler durchkommt, alle zwei bis drei Wochen Versionen mit neuen Features zu liefern.
Fragen nun:
1. Ist dieser Rhythmus akzeptabel?
2. Wo sollen die Updates hin? -- Ich könnte die ersten beiden Posts hier im Thread jeweils bearbeiten, sodass sie immer auf aktuellem Stand sind; ich könnte beides jeweils "unten" im Thread weiterlaufen lassen (dann kann Später das Suchen allerdings nervig werden), oder auch für jede Version einen neuen Thread aufmachen (dann gibt das viele Threads und die jeweils alten sollten vrmtl. geschlossen werden).

Item-Bezüge:
Bisher gibt es ja keine genaue Entsprechung zu Forlages #behalte [(n)] (item). Grund ist das Phänomen, dass, nachdem ich einmal mit #behalte angefangen hatte, keine drei Monate später fast alle meine Einheiten irgendein #behalte hatten (einfach, damit sie sich nicht ständig gegenseitig beklauen), was ich nervig fand. Folge sind die kategorisierten Lager-Funktionen, die nur bestimmte Items von allen Einheiten einziehen. Beim Nachdenken über einen Blocker gegen diese für Transporter ist mir nun aufgegangen, dass #behalte-Analoga trotzdem praktisch und nützlich sind, wenn sie entsprechend diversifiziert werden.
Mir schweben da vor:
- ein Meta, das Einzel-Items vom Lager einzieht (zB damit Soldaten sich eigenständig beim Waffenlager bedienen);
- ein Meta für Einzel-Items, mit dem diese von allen Einheiten in der Region eingezogen werden (die genaue Entsprechung zu Forlages #behalte);
- ein Meta, das den Einzug von Greifeneiern, Baumaterial, Luxusgütern und Silber, sowie den universellen #behalte blockt (für Transporter u.ä)
- ein Meta, das verhindert, dass die Einheit Silber zugeteilt bekommt (um Überladungen zu vermeiden und die Einheit beweglich zu halten..Stichwort "Blechbüchsen").
Nun ganz platt: Ich bitte um Namesvorschläge für die Metas. Ideen hätte ich zwar, aber ich will sicher gehen, dass die Dinger auch für andere halbwegs intuitiv erfassbar sind (und da ist mein eigener Kopf manchmal zu doof für).

In der Aufzählung nicht erwähnt aber geplant sind:
+belade und +entlade (wie ihre Forlage-Verwandten;)
+lager (item): das den jeweiligen Kategorien-Lagern die Kompetenz für einzelne Items wegnimmt (zB um Katapulte getrennt von Bögen und Armbrüsten zu haben oder Holz woanders als Steine und Eisen);

Umbenennung +potter ?
Spiele mit dem Gedanken, +potter zu +reeder umzubenennen.
Eigentlich wollte ich keine Funktionen umbenennen, um denen, die CbC schon anwenden keine unnötige Arbeit zu machen. Halte ich in diesem einen Fall aber für vertretbar, um die Intuitivität der Anwendung zu erhöhen. Meinungen dazu?

Gruß
Nemo
I may go pop -- Excuse me!

Benutzeravatar
nemo
Heerführer
Beiträge: 232
Registriert: Mi 25. Feb 2015, 12:06

Dok-Fehler +herde

Beitrag von nemo » Do 23. Feb 2017, 14:07

Thalian hat geschrieben:Fehler mit +herde gefunden
Sorry, wurde von mir fehlerhaft dokumentiert. (Tier) und (n) müssen die Plätze tauschen, also etwa
// +herde Pferd 0.

Korrigier ich gleich oben.
I may go pop -- Excuse me!

Benutzeravatar
Thalian
Administrator
Beiträge: 653
Registriert: Mo 5. Jan 2015, 14:25
Kontaktdaten:

Re: Command By Comments

Beitrag von Thalian » Do 23. Feb 2017, 15:14

nemo hat geschrieben:Ich hatte mir gedacht, einerseits wöchentlich gefixte Versionen rauszuhauen (sofern Fehler auffallen und ich zum reparieren gekommen bin, das ist), die auch schon neue Features enthalten können, andererseits, wenn es so lange ohne Fehler durchkommt, alle zwei bis drei Wochen Versionen mit neuen Features zu liefern.
Fragen nun:
1. Ist dieser Rhythmus akzeptabel?
2. Wo sollen die Updates hin? -- Ich könnte die ersten beiden Posts hier im Thread jeweils bearbeiten, sodass sie immer auf aktuellem Stand sind; ich könnte beides jeweils "unten" im Thread weiterlaufen lassen (dann kann Später das Suchen allerdings nervig werden), oder auch für jede Version einen neuen Thread aufmachen (dann gibt das viele Threads und die jeweils alten sollten vrmtl. geschlossen werden).
Wie wäre es, wenn Du einen Thread "Command By Comments - Code" machst, in dem Du den/die Posts wöchentlich oder regelmäßig updatest, und einen anderen Thread für DIskussionen dazu?

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste