Das schlimme ist halt, wenn man sich bestimmte Sachen in CommonAPI2 anschaut,
die Entwicklungszeit zum Ziel absurd hoch ist (weil UG Sachen nicht Umsetzen möchte).
Die Umsetzung dann gerade lächerlich klein ist.
Und der Support Code an das Ziel zu kommen dann 99% der Arbeit ausmacht.
Beispiel, ich hab ewig versucht mit Bordmitteln die Daten der Lane Configuration für geschlossene Lanes (Rotphase) in eine Konstruktion zu speichern,
Im Endeffekt hab ich nun Code um Konstuktionsskripte .script auszuführen, das musste ich mir erst mühsam in 2 Monaten mit Vorwissen erarbeiten, wie das funktioniert...
https://commonapi2.bytetransfe…?id=constructionextradesc
ConstructionAddon hat dann gerade mal 1000 Zeilen, so ca. 200 Zeilen beschäftigten sich wirklich um ein Node auf gesperrt zuschalten, damit zum Beispiel die Klappbrücke funktioniert.
Hätte ich Platz in einer eigenen Entity Komponente und Scripte aufrufen, oder ein bisl Platz im ConstructionBuilder, oweia wäre das Produktiv ...
Da wären wir schon bei TPF4 oder einem Tram DLC...
Bestimme Sachen liefen noch in TPF1, Animationen starten via API, das wurde aber fallen gelassen. (Es gibt triftige Gründe, aber CommonAPI2 baut was vergleichbares wieder ein)
Ggf. hat man sogar weniger Optionen in nachfolgenden Versionen von TPF also...
Um das mal mit dem Code zu veranschaulichen, sobald der Script Code mir die edges herauswirft, die den Verkehr der Brücke anhalten soll, wird der Code hier aufgerufen:
void LockConstructionEdges(ecs::Engine* engine, ecs::TransportNetworkSystem *transportnetworksystem, const ecs::Entity *entity, ecs::component::TransportNetwork* transportNetwork, std::vector<std::pair<int, int>> &edgeBarrier) {
transport::EdgeUseManager* edgeUseManager = transportnetworksystem->edgeUseManager;
auto tpinternal = transportnetworksystem->m_tpNetData->tpinternal;
auto key = tpinternal.m_key2index.at(entity->id);
if (key < 0) {
msglog(MSGLOG_ALWAYS, "LockConstructionEdges id = %i, no tpinternal.m_key2index", entity->id);
return;
};
auto dataForEdges = &tpinternal.m_index2data.at(key).edges;
auto edgesSize = transportNetwork->edges.size();
for (auto it = edgeBarrier.begin(); it != edgeBarrier.end(); it++) {
auto edgeid_index = it->first;
if (edgeid_index < 0 || edgeid_index >= edgesSize) {
continue;
}
auto edge = &transportNetwork->edges.at(edgeid_index);
transport::PortId portId;
if ( it->second != 1) {
portId.nodeid.id = edge->conns0.id;
portId.nodeid.index = edge->conns0.index;
portId.port = dataForEdges->at(edgeid_index).ports[0];
} else {
portId.nodeid.id = edge->conns1.id;
portId.nodeid.index = edge->conns1.index;
portId.port = dataForEdges->at(edgeid_index).ports[1];
}
//msglog(MSGLOG_ALWAYS, "SetPortLocked portid.nodeid.id = %i portId.nodeid.index = %i portId.port = %i", portId.nodeid.id, portId.nodeid.index, portId.port);
if (!edgeUseManager->GetPortLocked(&portId)) {
edgeUseManager->SetPortLocked(&portId, true);
};
};
};
Und das ist der Teil der die laneConfigFn aufruft und die Daten holt:
try {
std::lock_guard<std::mutex> lock(LockUnlockConstructionEdges_mutex);
auto result = conDescExtra->runLaneConfigFn(gameState, &con->params);
if (result.isNil()) {
return;
}
auto ctx = luaTPF::access_context::create();
luaTPF::Table* tableEdgeBarrier;
if (result.get("tnBarrier", &tableEdgeBarrier, false)) {
auto ctxEdgeBarrier= luaTPF::access_context::addKey("tnBarrier");
for (auto it = tableEdgeBarrier->daten.begin(); it != tableEdgeBarrier->daten.end(); it++) {
std::string keyStr;
if (it->first.isString()) {
keyStr = it->first.getString();
} else {
keyStr = std::to_string(it->first.getInteger());
}
auto ctxentrykey = luaTPF::access_context::addKey(keyStr);
int32_t edgeId = -1;
int32_t port = 0;
bool portA = false;
bool portB = false;
if (it->second.get("edgeId", edgeId, true)) {
if (it->second.get("portA", portA, false)) {
} else {
// not set, use default true
portA = true;
}
it->second.get("portB", portB, false);
if (portA) {
edgeBarriers.emplace_back(edgeId, 0);
}
if (portB) {
edgeBarriers.emplace_back(edgeId, 1);
}
};
};
};
} catch(std::exception &e) {
msglog(MSGLOG_ERROR, "Exception in LockUnlockConstructionEdges runLaneConfigFn (%s) %s", con->fileName.c_str(), e.what());
}
if (!edgeBarriers.empty()) {
try {
LockConstructionEdges(engine, transportnetworksystem, entity, transportNetwork, edgeBarriers);
} catch(std::exception &e) {
msglog(MSGLOG_ERROR, "Exception in LockConstructionEdges %s", e.what());
}
};
Alles anzeigen
Feature komplett, mit Modding Support...
Der luaTPF::access_context::addKey Circus mache ich um brauchbare Fehlermeldungen zu erstellen,
wenn ich das weglasse, könnte ich noch Code streichen...
PS: Der Code ist auf meinem eigenen Mist in der Freizeit entstanden, Namen für APIs oder Klassen sind an TPF2 angelehnt, aber sind mein eigener Code der ggf. TPF2 Code aufruft.
Ich habe meine eigenen C++ Header für den ganzen Kram, daher ist die Umsetzung quasi C++ Code ohne Klassen Support.
Zurück zum Thema:
Bessere API wünsche ich mir, brauchbare API Bindungen auch. Städte und Hausbau? Mindestens 20% des Proposal für Konstruktionen in TPF2 könnt Ihr gar nicht sehen...