nur ich als rang 11 sehe net die uniform für rang 7 und anderrum denauso nicht.
Wo siehst du sie nicht?
Schön, dass du den Weg zu NodeZone.net gefunden hast! Aktuell bist du nicht angemeldet und kannst deshalb nur eingeschränkt auf unsere Community zugreifen. Um alle Funktionen freizuschalten, spannende Inhalte zu entdecken und dich aktiv einzubringen, registriere dich jetzt kostenlos oder melde dich mit deinem Account an.
nur ich als rang 11 sehe net die uniform für rang 7 und anderrum denauso nicht.
Wo siehst du sie nicht?
Joa, das liegt ja wohl daran, dass es die gleiche Uniform ist. Im Shop kannst du dir also die Einträge sparen und einfach nur einmal "Dienstuniform" anbieten. Je nach Rang ist der Skin doch dann schon perfekt.
Also in der Welt das zu sehen ist in 5.0 integriert. Im Shop kann man - glaube ich - aber nur die Uniform kaufen. Geskinnt wird dann sobald man es anhat je nach Coplevel...
Also ich tue mich echt schwer dein Geschriebenes zu verstehen.
Ich versuche mal zu erläutern, wie ich es verstanden habe. Vielleicht kannst du mich ja dann korrigieren bzw. mir sage, dass es so ist.
Du willst, dass Cop A(Rang 11) ALLE Cops mit dem selben Skin auf der Uniform sieht, egal welches Level. Cop B(Rang 7) soll entsprechend alle Cops unabhängig vom Rang mit dem Skin für Rang 7 sehen.
Wenn ich das so jetzt richtig interpretiere, dann bleibt die Frage, was die Civs denn dann sehen sollen.
Eine weitere Frage: Geht es dir nur um den Shop?
Alternative Interpretation: Willst du, dass ein Rang 11 Cop eine Uniform(eigentlich Skin, da gleiche Uniform aber unterschiedliche Skins) kaufen kann, die für Rang 7 vorgesehen ist und dann eben aussieht wie für Rang 7, auch wenn er es anhat?
Also im 5.0 Framework ist es genauso wie du sagst:
Lass mich wissen, wenn du das ernsthaft planst. Wäre unter Umständen interessiert dir dabei zu helfen.
Das Problem bei solchen Kursen ist: Wo fängt man an(Entwicklungsumgebung, Was ist eine Variable) und wo hört man auf(Git, Threads, Optimierung).
Unterm Strich ein sehr weites Feld. Vielleicht sollte man da auch ganz klar ein Thema auswählen: SQF und Programmierung allgemein(Variable bis Threads), Altis Life, Mods, Server-Client, Workflow, ...
Dann ist die Frage nach Material. Vortrag halten bringt wenig, wäre aber immer wieder anwendbar oder sogar für eine Freigabe geeignet, dass man sich daran selbst bildet.
Und wie sollen die Kursteilnehmer zusammenfinden (Discord, TS, ??), wann(Leute springen gerne mal zwischendrin ab weil Mami zum Essen ruft) und wie sorgt man dafür, dass jeder mitkommt und eventuell parallel übt?
Netter Vorschlag aber ich sehe leider sehr viele Stolpersteine.
1. Sound als Ogg in den entsprechenden Ordner legen und diesen in der Cfg(description.ext) anlegen.
2. Funktion zum lokalen abspielen des Sounds anlegen. Wichtiger Command: playSound
3. Der aufrufenden Person einen Button, eine Action oder sonst eine Möglichkeit geben eine Funktion aufzurufen.
4. Diese Funktion ruft dann mittels remoteExec die vorhin erstellte Methode(vgl. 2.) beim "Opfer" auf.
5. Nicht vergessen: Mit remoteExec aufgerufene Methoden müssen vorher freigegeben werden. Dafür gibts es eine entsprechende Cfg(CfgRemoteExec.hpp)
happy scripting
Funtions\Systems\fn_spawnVehicle.sqf im Server
und
core\shops\fn_vehicleShopBuy.sqf in der Client-Mission
mal begutachten. Diese spawnen Fahrzeuge.
wichtige Methoden zum entfernen aller Sachen im Inventar: clearWeaponCargoGlobal, clearMagazineCargoGlobal, clearItemCargoGlobal
if (player getVariable ["restrained", false]) then {
if (isNull _curTarget) exitWith {closeDialog 0;}; //Bad target
if (!isPlayer _curTarget) exitWith {closeDialog 0;}; //Bad side check?
if (player distance _curTarget > 4 ) exitWith {closeDialog 0;}; // Prevents menu accessing from far distances.
};
... wenn ich festgenommen bin, dann überprüfen wir mal ein paar Abbruch-Bedingungen und sonst nicht?
Also wenn ich frei rumlaufe, dann kann ich bei allem und nichts dieses Menü öffnen.
Falls du mit diesem Hinweis dein Problem nicht ganz beheben kannst, hier noch ein Hinweis:
Leider zeigst du uns nicht, wann und wie du den gezeigten Code aufrufst. Daher lauert im Dunkeln eine weitere Fehlerquelle: Die Überprüfung, ob man eine Person anschaut oder vielleicht ein Fahrzeug etc ist nämlich nicht im gezeigten Code drin. Wenn du also die Checks nicht vor dem Aufruf machst, wird das Ding bei allem aufgehen, was du anschaust. Und das muss natürlich als Parameter übergeben werden.
Falls du also noch weitere Hilfe benötigst, vergiss bitte nicht uns auch den aufrufenden Code zu zeigen.
Guten Start in die Woche
Das ist eine für dich angepasst fn_playerSkins.sqf
Die kannst du mal probieren. Eventuell stimmt aber noch etwas ganz anderes nicht. Gibt einfach Rückmeldung
#include "..\..\script_macros.hpp"
/*
File: fn_playerSkins.sqf
Author: Daniel Stuart
Description:
Sets skins for players by their side and uniform.
*/
private ["_skinName"];
switch (playerSide) do {
case civilian: {
if (LIFE_SETTINGS(getNumber,"civ_skins") isEqualTo 1) then {
if (uniform player isEqualTo "U_C_Poloshirt_blue") then {
player setObjectTextureGlobal [0, "textures\civilian_uniform_1.jpg"];
};
if (uniform player isEqualTo "U_C_Poloshirt_burgundy") then {
player setObjectTextureGlobal [0, "textures\civilian_uniform_2.jpg"];
};
if (uniform player isEqualTo "U_C_Poloshirt_stripped") then {
player setObjectTextureGlobal [0, "textures\civilian_uniform_3.jpg"];
};
if (uniform player isEqualTo "U_C_Poloshirt_tricolour") then {
player setObjectTextureGlobal [0, "textures\civilian_uniform_4.jpg"];
};
if (uniform player isEqualTo "U_C_Poloshirt_salmon") then {
player setObjectTextureGlobal [0, "textures\civilian_uniform_5.jpg"];
};
if (uniform player isEqualTo "U_C_Poloshirt_redwhite") then {
player setObjectTextureGlobal [0, "textures\civilian_uniform_6.jpg"];
};
if (uniform player isEqualTo "U_C_Commoner1_1") then {
player setObjectTextureGlobal [0, "textures\civilian_uniform_7.jpg"];
};
};
};
case west: {
/*if (uniform player isEqualTo "U_Rangemaster") then {
_skinName = "textures\cop_uniform.jpg";
if (LIFE_SETTINGS(getNumber,"cop_extendedSkins") isEqualTo 1) then {
if (FETCH_CONST(life_coplevel) >= 1) then {
_skinName = ["textures\cop_uniform_",(FETCH_CONST(life_coplevel)),".jpg"] joinString "";
};
};
player setObjectTextureGlobal [0, _skinName];
};*/
if (uniform player == "U_Rangemaster") then {
player setObjectTextureGlobal [0,"textures\rekrut.jpg"];
};
if (uniform player == "U_B_CombatUniform_mcam") then {
player setObjectTextureGlobal [0,"textures\Cop_Uniform_2.jpg"];
};
if (uniform player == "U_B_CTRG_3") then {
player setObjectTextureGlobal [0,"textures\cop_uniform_4.jpg"];
};
if (uniform player == "U_B_GEN_Commander_F") then {
player setObjectTextureGlobal [0,"textures\cop_uniform_sweater.paa"];
};
if (uniform player == "U_B_CTRG_1") then {
player setObjectTextureGlobal [0,"textures\sek.jpg"];
};
if (uniform player == "U_B_CombatUniform_mcam_vest") then {
player setObjectTextureGlobal [0,"textures\Zoll Uniform.jpg"];
};
if (backpack player == "B_Carryall_cbr") then {
(unitBackpack player) setObjectTextureGlobal [0,""];
};
};
case independent: {
if (uniform player isEqualTo "U_Rangemaster") then {
player setObjectTextureGlobal [0, "textures\medic_uniform.jpg"];
};
};
};
Alles anzeigen
das hilft sehr. Also der Keyhandler kann nicht richtig funktionieren, da der davon ausgeht, das deine Uniformen durchnummeriert sind. Und dazu wird davon ausgegangen, dass Cops nur "U_Rangemaster" als Kleidung tragen. Das wird so schnell also nicht funktionieren.
Kannst du uns sagen, welche Uniformen funktionieren, oder ob überhaupt irgendetwas so funktioniert, wie du das willst?
hm irgendwie geht das nicht richtig
also die Nachicht das es aktualisiert worden ist, ist da aber sonnst passiert nix
Bekommst du denn auch die Meldung, dass dein Skin neugeladen wurde?
Schick doch gleich mal deine fn_initcop.sqf mit und vielleicht einen Screenshot deines Textturenordners, damit wir sehen wie deine Skins benannt sind.
Funktioniert nur das setzten der Skins über den Keyhandler nicht, oder allgemein garnicht?
"Irgendwie geht das nicht" ist keine Fehlerbeschreibung.
Erscheinen die Skins nur für andere nicht, oder auch für sich selbst?
Gibt es Fehlermeldungen im Log?
Ist die Datei core/functions/fn_playerSkins.sqf vorhanden und richtig?
\core\init.sqf
{
_x params [["_chan",-1,[0]], ["_noText","false",[""]], ["_noVoice","false",[""]]];
_noText = [false,true] select ((["false","true"] find toLower _noText) max 0);
_noVoice = [false,true] select ((["false","true"] find toLower _noVoice) max 0);
if(_noVoice && _noText) then {
_chan enableChannel false; // disable channel
} else {
_chan enableChannel [!_noText, !_noVoice]; // disable parts of channel
};
} forEach getArray (missionConfigFile >> "disableChannels");
Alles anzeigen
description.ext
disableChannels[]= {{0,true,true},{1,true,true},{2,true,true},{6,false,true},{7,false,true},{8,false,true},{9,false,true}};
Das hat damals ganz gut funktioniert.
Achtung bei Altis Life. Da werden auf dem Server in der init.sqf ein paar Radio Channels erstellt
life_radio_west = radioChannelCreate [[0, 0.95, 1, 0.8], "Side Channel", "%UNIT_NAME", []];
life_radio_indep = radioChannelCreate [[0, 0.95, 1, 0.8], "Side Channel", "%UNIT_NAME", []];
life_radio_east = radioChannelCreate [[0, 0.95, 1, 0.8], "Side Channel", "%UNIT_NAME", []];
life_radio_civ = radioChannelCreate [[0, 0.95, 1, 0.8], "Side Channel", "%UNIT_NAME", []];
Das sind im Endefekt Side Channels, die sich nicht über die description.ext sperren lassen. Einfach hier raus machen und die eigentlichen Sidechannel über die .ext deaktivieren.
Eventuell ist da noch mehr, aber das war das erste, woran ich mich erinnern konnte. Einfach mal die kompletten Ordner nach "radioChannelCreate" durchsuchen lassen. Vielleicht findet sich da noch mehr von dem Dreck auch Client-seitig.
Hoffe das ist ein helfender Anstoß. Vielleicht kannst du ja mal zusammenfassen, was man alles tun muss, wenn du es geschafft hast. Wäre sicher auch für andere hilfreich
Brauchste kein Skript für. Nur ein Medikit. Wenn du es wirklich über ein Item willst: Item anlegen, dann unter core\pmenu\fn_useIteam.sqf einen Case in das Switch einbauen
case (_item == "MEINSCHMERZMITTELCHEN"):
{
if(vehicle player != player) exitWith {hintSilent "Du kannst dich nicht in einem Fahrzeug heilen..."};
_target = cursorObject;
if(!isPlayer _target) exitWith {};
if(([false,_item,1] call life_fnc_handleInv)) then // Hier wird das Mittelchen verbraucht
{
// Eventuell Animationen oder so einfügen?
_target setDamage 0;
};
};
Alles anzeigen
Dann willst du die Leute mit Verletzungen wiederbeleben. Also ab in die core\medical\fn_revived.sqf
player setDamage 0.8;
Das dürfte es dann in etwa gewesen sein. Eventuell sind Anpassungen erforderlich, da ich zu faul war in den 5.xx Code zu schauen...
@At0miXHD
soweit so gut. Sieht so aus, als wäre der entscheidende und funktionierende Aufruf über das Z-Inventar am Ende [] spawn life_fnc_pickAxeUse;
Der passiert auch so in deinem KeyHandler:
//Q Key
case 16: {
if (life_inv_pickaxe > 0) then {
if(life_action_inUse) exitwith {};
if(life_interrupted) exitWith {life_interrupted = false; titleText[localize "STR_NOTF_ActionCancel","PLAIN"]; life_action_inUse = false;};
[] spawn {
private "_handles";
if(life_action_inUse) exitwith {};
life_action_inUse = true;
_handles = [] spawn life_fnc_pickAxeUse;
waitUntil {scriptDone _handles};
sleep 1;
life_action_inUse = false;
};
};
};
Alles anzeigen
Was könnte das Skript also davon abhalten die entsprechende Zeile auszuführen?
Ich gehe mal von innen nach außen:
1. if(life_action_inUse) exitwith {};hier haben wir eine klassische Abbruchbedingung. Übrigens eine sehr häufig auftretende bei AltisLife. Da der Wert aber erst nach dem Überprüfen auf wahr gesetzt wird und es vorher keinen Grund zur Annahme gibt, dass der Wert vorher schonmal true war, ignoriere ich das jetzt einfach. Testen könnte man das ganze aber, indem man innerhalb des exitwith codeblocks eine Ausgabe einbaut(hint, globalChat, diag_log)
2. if(life_interrupted) exitWith {life_interrupted = false; titleText[localize "STR_NOTF_ActionCancel","PLAIN"]; life_action_inUse = false;}; Wieder eine Abbruchbedingung. Da ist aber schon eine Ausgabe drin über den titleText. Falls es hieran scheitert, hättest du es bereits mitbekommen.
3. if(life_action_inUse) exitwith {};Nochmal. vgl 1.
4. if (life_inv_pickaxe > 0)diese Bedingung muss erfüllt sein. Ist sie das wirklich? Einfach mal for diesem IF eine Ausgabe einbauen: hint str life_inv_pickaxeund schon kennen wir den Wert. Oder der Wert erscheint nicht? Dann muss das Problem noch höher liegen:
5. Das Skript landet nie in diesem "case": Und das ist auch schon dein Fehler. Es gibt bereits eine Tastenbelegung für Q, also auch einen case 16. Vergleiche die Zeilen 274 und folgende.
Wie kann man das rausfinden? Entweder man durchsucht seinen Code mittels des Editors auf den case 16, oder man baut wieder eine Ausgabe in dem case-block ein und schaut, ob diese ausgegeben wird.
Lösung:
Den bestehenden case erweitern. Der Code der früheren Zeilen 274-288 ist danach etwas länger und sieht in etwa so aus:
case 16:
{
// Sirene für Cops
if(_shift && playerSide == west && !(life_siren2_active) && vehicle player != player && ((driver vehicle player) == player)) then
{
_veh = vehicle player;
[[_veh,"stop_car"],"life_fnc_globalSound",true,false] spawn life_fnc_MP;
[] spawn
{
life_siren2_active = true;
sleep 3.5;
life_siren2_active = false;
};
_handled = true;
} else {
//Farmingtaste
if (life_inv_pickaxe > 0) then {
if(life_action_inUse) exitwith {};
if(life_interrupted) exitWith {life_interrupted = false; titleText[localize "STR_NOTF_ActionCancel","PLAIN"]; life_action_inUse = false;};
[] spawn {
private "_handles";
if(life_action_inUse) exitwith {};
life_action_inUse = true;
_handles = [] spawn life_fnc_pickAxeUse;
waitUntil {scriptDone _handles};
sleep 1;
life_action_inUse = false;
};
_handled = true;
};
};
};
Alles anzeigen
So ich danke fürs lesen und hoffe du nimmst etwas mehr mit als nur die Lösung. Hilf dir selbst und überprüfe Schritt für Schritt die Abläufe. Bau dafür Ausgaben(z.B. hint, globalChat, diag_log) ein und teste das ganze!
Und bitte bitte bitte... formatiere deinen Code.
Zum Thema Fehlermeldungen[Nur, falls du es noch nicht wusstest!]: Im Arma3 Launcher unter Parameter den Haken bei "Keine Logs"(findest du unter Erweitert) rausmachen und den Haken bei "Zeigt Skriptfehler"(findest du unter Autor) rein machen. Dann siehst du Fehlermeldungen auf jedem Server(manchmal ganz interessant, was andere alles so verkacken) immer gleich auf dem Bildschirm während dem Spiel und kannst sie danach noch in den Logs nachlesen. Die findest du übrigens normalerweise unter C:\Users\BENTUZER\AppData\Local\Arma 3. Es sind normale Textfiles, welche allerdings auf .rpt enden. Kannste mit jedem Editor anschauen
Wünsche einen ruhigen Freitag und einen guten Start ins Wochenende