Poste bitte mal folgende Dateien:
- /server/functions/serverPlayerDied.sqf
- globalCompile.sqf
und am besten nochmal deine deadBodyFlies.sqf
MfG Barney
Poste bitte mal folgende Dateien:
- /server/functions/serverPlayerDied.sqf
- globalCompile.sqf
und am besten nochmal deine deadBodyFlies.sqf
MfG Barney
Ich hab das HUD mal ein wenig auf den neusten Stand gebracht, es sieht noch genauso aus nur die Funktion dahinter und die Anzahl der benötigten Bilder ist kleiner da ich RscProgress benutze zum dartstellen und nicht 11 Bilder pro Stat.
Also: hud_stats.hpp (denkt dran die Pfade der Bilder zu ändern sollten die sich bei euch unterscheiden)
#define ST_CENTER 0x02
class playerHUD {
idd = -1;
duration = 10e10;
movingEnable = 0;
fadein = 0;
fadeout = 0;
name = "playerHUD";
onLoad = "uiNamespace setVariable ['playerHUD',_this select 0]";
objects[] = {};
class controlsBackground
{
class LIFE_BAR_SeatBelt: Life_RscPicture
{
idc = 3001;
text = "textures\HUD\seatbeltOn.paa";
x = 0.952292 * safezoneW + safezoneX;
y = 0.574333 * safezoneH + safezoneY;
w = 0.0331042 * safezoneW;
h = 0.0589743 * safezoneH;
};
class LIFE_BAR_Speaker: Life_RscPicture
{
idc = 3000;
text = "textures\HUD\earplugs.paa";
x = 0.952292 * safezoneW + safezoneX;
y = 0.640333 * safezoneH + safezoneY;
w = 0.0331042 * safezoneW;
h = 0.0589743 * safezoneH;
};
class LIFE_BAR_HEALTH_RING: Life_RscProgress
{
idc = 3200;
text = "";
texture = "textures\HUD\health_full.paa";
style = 1;
colorFrame[] = {0, 0, 0, 0};
colorBar[] = {1,1,1,1};
x = 0.952292 * safezoneW + safezoneX;
y = 0.706333 * safezoneH + safezoneY;
w = 0.0331042 * safezoneW;
h = 0.0589743 * safezoneH;
};
class LIFE_BAR_HEALTH_RING_empty: Life_RscProgress
{
idc = 3201;
text = "";
texture = "textures\HUD\health_empty.paa";
style = 1;
colorFrame[] = {0, 0, 0, 0};
colorBar[] = {1,1,1,1};
x = 0.952292 * safezoneW + safezoneX;
y = 0.706333 * safezoneH + safezoneY;
w = 0.0331042 * safezoneW;
h = 0.0589743 * safezoneH;
};
class LIFE_BAR_FOOD_RING: Life_RscProgress
{
idc = 3202;
text = "";
colorFrame[] = {0, 0, 0, 0};
colorBar[] = {1,1,1,1};
texture = "textures\HUD\food_full.paa";
style = 1;
x = 0.952292 * safezoneW + safezoneX;
y = 0.772333 * safezoneH + safezoneY;
w = 0.0331042 * safezoneW;
h = 0.0589743 * safezoneH;
};
class LIFE_BAR_FOOD_RING_empty: Life_RscProgress
{
idc = 3203;
text = "";
colorFrame[] = {0, 0, 0, 0};
colorBar[] = {1,1,1,1};
texture = "textures\HUD\food_empty.paa";
style = 1;
x = 0.952292 * safezoneW + safezoneX;
y = 0.772333 * safezoneH + safezoneY;
w = 0.0331042 * safezoneW;
h = 0.0589743 * safezoneH;
};
class LIFE_BAR_WATER_RING: Life_RscProgress
{
idc = 3204;
text = "";
colorFrame[] = {0, 0, 0, 0};
colorBar[] = {1,1,1,1};
texture = "textures\HUD\water_full.paa";
style = 1;
x = 0.952292 * safezoneW + safezoneX;
y = 0.838333 * safezoneH + safezoneY;
w = 0.0331042 * safezoneW;
h = 0.0589743 * safezoneH;
};
class LIFE_BAR_WATER_RING_empty: Life_RscProgress
{
idc = 3205;
text = "";
colorFrame[] = {0, 0, 0, 0};
colorBar[] = {1,1,1,1};
texture = "textures\HUD\water_empty.paa";
style = 1;
x = 0.952292 * safezoneW + safezoneX;
y = 0.838333 * safezoneH + safezoneY;
w = 0.0331042 * safezoneW;
h = 0.0589743 * safezoneH;
};
};
};
Alles anzeigen
fn_hudSetup:
#include "..\..\script_macros.hpp"
disableSerialization;
cutRsc ["playerHUD", "PLAIN", 4, false];
_display = uiNamespace getvariable["playerHUD",displayNull];
if(isnull _display) exitWith {diag_log "ERROR - Creating HUD Display fn_hudSetup.sqf line 13"};
_h_f = _display displayCtrl 3200;
_h_e = _display displayCtrl 3201;
_F_f = _display displayCtrl 3202;
_F_e = _display displayCtrl 3203;
_W_f = _display displayCtrl 3204;
_W_e = _display displayCtrl 3205;
{
_x progressSetPosition 1;
} foreach [_h_f,_h_e,_F_f,_F_e,_W_f,_W_e];
[] call life_fnc_hudUpdate;
[] spawn
{
private ["_dam"];
for "_i" from 0 to 1 step 0 do {
_dam = damage player;
waitUntil {!((damage player) isEqualTo _dam)};
[] call life_fnc_hudUpdate;
};
};
Alles anzeigen
fn_hudUpdate.sqf:
#include "..\..\script_macros.hpp"
disableSerialization;
private ["_display","_h_f","_h_e","_F_f","_F_e","_W_f","_W_e","_earplugs","_control_full","_control_empty","_value","_pos_f","_pos_e"];
_display = uiNamespace getvariable["playerHUD",displayNull];
if(isnull _display) exitWith {[] call life_fnc_hudSetup;};
_h_f = _display displayCtrl 3200;
_h_e = _display displayCtrl 3201;
_F_f = _display displayCtrl 3202;
_F_e = _display displayCtrl 3203;
_W_f = _display displayCtrl 3204;
_W_e = _display displayCtrl 3205;
_seatbelt = _display displayCtrl 3001;
_earplugs = _display displayCtrl 3000;
if(!isNil "life_seatbelt") then {
if ( vehicle player != player ) then {
_seatbelt ctrlShow true;
if(life_seatbelt) then {
_seatbelt ctrlSetText "textures\HUD\seatbeltOn.paa";
} else {
_seatbelt ctrlSetText "textures\HUD\seatbeltOff.paa";
};
} else {
_seatbelt ctrlshow false;
};
} else {
_seatbelt ctrlshow false;
};
if!(isnil "life_fadeSound") then {
if(life_fadeSound isEqualTo 0) then {
_earplugs ctrlShow false;
} else {
_earplugs ctrlShow true;
};
} else {
_earplugs ctrlShow false;
};
{
_control_full = _x select 0;
_control_empty = _x select 1;
_value = (_x select 2)/100;
_control_empty progressSetPosition (1-_value);
_pos_f = ctrlPosition _control_full; // [x, y, w, h]
_control_empty ctrlSetPosition[_pos_f select 0,(_pos_f select 1)-((_pos_f select 3)*_value),_pos_f select 2, _pos_f select 3];
_control_empty ctrlCommit 0;
} foreach
[
[_h_f,_h_e,((1 - damage player) *100)],
[_F_f,_F_e,life_hunger],
[_W_f,_W_e,life_thirst]
];
Alles anzeigen
MfG Barney
PS: Ka warum ich auch für die Full Bilder RscProgress controls genommen habe, man könnte die auch auf rscPictures ändern . Die #include "..\..\script_macros.hpp" könnte man auch löschen, bin aber zu faul
Ok, damit andere die ein ähnliches Problem haben das nicht so wie ich damals mit der Datenbank und co lösen müssen.
ES GIBT DAFÜR NE FUNKTION VON ARMA
ALL DIE ARBEIT UND DANN HABEN DIE NE FUNKTION DAFÜR
MfG Barney
Blackfish just tells you to change the Code from this:
if (_vehicle in life_vehicles) then {
hint format[localize "STR_NOTF_Crushed",[_value] call life_fnc_numberText,_type];
deleteVehicle _vehicle;
BANK = BANK + _value;
};
to this:
hint format[localize "STR_NOTF_Crushed",[_value] call life_fnc_numberText,_type];
deleteVehicle _vehicle;
BANK = BANK + _value;
MfG Barney
18 Sekunden, neuer Rekord
???
Man benutzt doch Selectrandom und nicht random, damit selected man random ein Wert aus einem Array, hat nichts mit Kommazahlen zu tun.
Natürlich soll er selectrandom benutzen. Das mit dem random habe ich nur noch als Hinweis hinzugefügt damit klar wird, das random halt keine absoluten Zahlen zurückgibt.
Moin,
im folgendem seht ihr ein Tutorial zum Einfügen von Basen in einen Altis life Server der Version 5.0.0 (DIESES TUT IST NICHTS FÜR ANGÄNGER). (BILDER IM ANHANG :O)
Dieses Video haben wir damals als Promo für diese Basen gemacht(Link zum Changelog im Forum ) (Ich hab leider keine Ahnung wie ich das Video kleiner krieg )
Dieses System wurde auf einem Vanilla Altis Life Server getestet - ICH HABE KEINE AHNUNG WIE SICH INFISTAR O.Ä. DARAUF AUSWIRKT
Das System stammt ursprünglich vom Löwenherz Altis Life Server ist jedoch von mir (war/bin, eher war, da DEV :O).
Eine Funktion in diesen Dateien kommt von Lucian, hier gehts zum TUT - volle Credits an ihn.
Alle Erbauer von Basen die nicht ich sind haben der Veröffentlichung zugestimmt - Danke Bloodwyn und EL Presidente.
Diese standard Basen funktionieren NUR auf Altis.
Solltet ihr eigene Basen bauen und in das System integrieren wollen solltet ihr wissen, dass dies sehr viel Arbeit ist und man auch Ahnung haben sollte wie Dinge in Arma funktionieren. Das Einbauen der beigefügten Basen ist jedoch sehr einfach.
Gundinformationen zu diesen Basen:
- Es sind insgesamt 7 Basen die hier jetzt drin sind
- Basen haben verschiedene "Ratings"(große Basen=Rating 3/mittlere Basen=Rating 2/kleine Basen=Rating 1)
- Das Rating hat Auswirkungen auf die Mietpreise und die Mindestanzahl an Gangmitgliedern die man haben muss um eine Basis überhaupt kaufen zu können
- Für eine Basis muss man Miete zahlen, im Moment wird die Miete alle 28 Tage fällig (RL tage) - ist aber umstellbar in der Config_bases.hpp
- Basenbesitzer sehen wann und wie viel Miete sie zahlen müssen am Basenschild (Für die Miete braucht man Geld aufm Gangkonto und muss Items am Basenschild einlagern)
- Basen brauchen schon während des Ausbauens Miete
- Sollte eine Gang mal die Miete nicht bezahlen bekommt diese Basis einen Strike
- Strikes können nicht von Spielern entfernt werden, nur Leute mit DB zugriff können dies tun
- Nach 3 Strikes(kann man auch umstellen) wird die Basis zurückgesetzt und kann ab dann von einer anderen Gang wieder gekauft werden
- Abhängig vom Rating der Basen haben die Basen unteschiedliche Austattungen
- Gangmitglieder können an der Base spawnen
- Die Gang kann sich Objekte zur Basis dazu kaufen und nach belieben in der Basis platzieren
- Um ein Inventar an der Base haben zu können muss sich die Gang eine oder mehrere Kisten mit Inventar aus dem BaseShop kaufen und platzieren - Das i und T Inventar dieser Kisten ist permanent und nur Gangmitglieder können an dies ran
- Im "admin_notifications" table in der DB kann man nachvollziehen was so mit den Basen passiert ist
- Im "bases" table in der Spalte "name" könnt ihr der Basis einen Namen geben. (Wir hatten Sie damals nach Orten in "HERR DER RINGE" benannt ) - Die Spalte "author" wird aber bitte so belassen
- Sollte eine Gang eine Basis aufgeben wird diese erst nach dem nächsten Restart von der Karte gelöscht und ist erst ab dann wieder kaufbar
Das eigentliche TUT:
1. Macht Backups von eurer mission.pbo und eurem @life_server
2. OHNE SCHEIß MACHT BACKUPS WIR WERDEN SEHR VIEL ÄNDERN!
3. Ladet euch die .zip hier vom Anhang runter
4. Öffnet die ZIP
5. Wir werden jetzt mehrere Dateien austauschen, solltet ihr diese Dateien bereits bearbeitet haben guckt euch einfach die Änderungen an und übernehmt diese (!!!!!WENN IHR NICHT WISST WAS IHR TUT LASST ES SEIN!!!!!):
Die "fn_updateHouseTrunk.sqf" und "fn_updateHouseContainers.sqf" in "\life_server\Functions\Housing\" aufm Server ersetzen durch die in der ZIP (die Dateien in der ZIP zum Austauschen sind im "zu ersetzende Dateien" Ordner in der ZIP ).
Die "fn_vehicleGarage.sqf" in "Altis_Life.Altis\dialog\functions\" mit der sich in der ZIP befindlichen austauschen.
Die "fn_inventoryOpened.sqf" und "fn_inventoryClosed.sqf" in "Altis_Life.Altis\core\functions\" mit der sich in der ZIP befindlichen austauschen.
6.In die init.sqf von life_server folgendes einfügen:
diag_log "Initializing Base System...";
[] call life_fnc_initBases;
diag_log "Base System initialized";
Das muss über folgendes:
/* Tell clients that the server is ready and is accepting queries */
life_server_isReady = true;
publicVariable "life_server_isReady";
7. In "Altis_Life.Altis\core\functions\fn_keyhandler.sqf" öffnen und folgendes einfügen:
//////////////////// BASE BUILD KEYS ////////////////////
case 203: // LEFT
{
if!(isnull LIFE_BASE_OBJECT) then {
LIFE_X = LIFE_X - LIFE_BASE_VALUE;
LIFE_BASE_OBJECT attachto[player,[LIFE_X,LIFE_Y,LIFE_Z]];
_handled = true;
};
};
case 205: // RIGHT
{
if!(isnull LIFE_BASE_OBJECT) then {
LIFE_X = LIFE_X + LIFE_BASE_VALUE;
LIFE_BASE_OBJECT attachto[player,[LIFE_X,LIFE_Y,LIFE_Z]];
_handled = true;
};
};
case 200: // UP
{
if!(isnull LIFE_BASE_OBJECT) then {
LIFE_Y = LIFE_Y - LIFE_BASE_VALUE;
LIFE_BASE_OBJECT attachto[player,[LIFE_X,LIFE_Y,LIFE_Z]];
_handled = true;
};
};
case 208: // DOWN
{
if!(isnull LIFE_BASE_OBJECT) then {
LIFE_Y = LIFE_Y + LIFE_BASE_VALUE;
LIFE_BASE_OBJECT attachto[player,[LIFE_X,LIFE_Y,LIFE_Z]];
_handled = true;
};
};
case 201: // BILD HOCH
{
if!(isnull LIFE_BASE_OBJECT) then {
LIFE_Z = LIFE_Z + LIFE_BASE_VALUE;
LIFE_BASE_OBJECT attachto[player,[LIFE_X,LIFE_Y,LIFE_Z]];
_handled = true;
};
};
case 209: // BILD RUNTER
{
if!(isnull LIFE_BASE_OBJECT) then {
LIFE_Z = LIFE_Z - LIFE_BASE_VALUE;
LIFE_BASE_OBJECT attachto[player,[LIFE_X,LIFE_Y,LIFE_Z]];
_handled = true;
};
};
case 28: // ENTER
{
if!(isnull LIFE_BASE_OBJECT) then {
0 spawn life_fnc_place_base_object;
};
};
//////////////////// BASE BUILD KEYS END////////////////////
Alles anzeigen
das muss unter:
// -- Disable commander/tactical view
if (LIFE_SETTINGS(getNumber,"disableCommanderView") isEqualTo 1) then {
private _CommandMode = actionKeys "tacticalView";
if (_code in _CommandMode) then {
hint localize "STR_NOTF_CommanderView";
_handled = true;
};
};
8. IN "Altis_Life.Altis\dialog\function\fn_spawnPointCfg.sqf" folgendes einfügen:
_ret = 0 call life_fnc_get_base_player;
if!(isnull (_ret select 0)) then {
_marker = createMarkerLocal ["LIFE_myBase",getpos(_ret select 0)];
_return pushback ["LIFE_myBase",(format["Base: %2(lvl %1) ",_ret select 1,_ret select 2]),"\a3\ui_f\data\map\MapControl\custommark_ca.paa"];
};
das muss direkt unter(also zwischen die beiden if-statements sollte eure Datei standardmäßig sein):
9. Den SQL Code aus "base_SQL_CODE.sql" (die Datei findet ihr in der .ZIP) in der DB ausführen(Das müsst ihr natürlich mit einem Acc machen der entsprechende Rechte hat)
10. Folgendes in die "Altis_Life.Altis\core\configuration.sqf" einfügen(ist eig egal wohin(solange ihrs nicht in die foreach-Schleifen packt)):
// BASE VARS
LIFE_BASE_OBJECT = objNull;
LIFE_Y = 10;
LIFE_X = 0;
LIFE_Z = 0;
LIFE_BASE_VALUE = 0.1;
LIFE_VehShop_Showcase = false;
LIFE_shop_show_vehicle = ObjNull;
LIFE_VehShop_Dir = 0;
LIFE_shop_Rotate_speed = 0.2;
LIFE_shop_cam = ObjNull;
LIFE_shop_light = ObjNull;
LIFE_distance_cam = 30;
// BASE VARS END
Alles anzeigen
11.Config_bases.hpp aus dem Ordner "\Config\" in der ZIP in "Altis_Life.Altis\config\" einfügen und ganz unten in der "Config_Master.hpp" (im selbem Verzeichnis) folgendes einfügen:
12. In der "life_server\Functions\Systems\fn_spawnvehicle.sqf" ersetzt ihr:
durch:
13.Server Dateien einfügen:
In "life_server/Functions" neuen Ordner namens "Bases" erstellen, da alle Dateien von der ZIP aus dem Ordner Base_server reinkopieren.
14. In der config.cpp (immer noch in life_server) unter der Klasse von "wanted_sys" folgendes eintragen (Mit unter der Klasse ist nicht in der Klasse gemeint sondern darunter):
class Bases {
file = "\life_server\Functions\Bases";
class base_activity_check {};
class base_material_request {};
class base_rental_sync{};
class basedelete_fromgang{};
class baseLevelUp{};
class dayCheck{};
class delete_base_object {};
class get_randomized_base_rent {};
class initBases {};
class insert_base_object {};
class sync_base_material {};
class update_base_object {};
class Insert_admin_notifiaction {};
};
Alles anzeigen
15. Jetzt fügt ihr alles aus dem Ordner "bases_client" (also auch die Ordner) in der ZIP in einen Ordner den ihr in "\Altis_Life.Altis\core" erstellt und "bases" nennt.
16.Die Functions.hpp in der Altis_Life.Altis öffnen und folgendes unter der Klasse von Admin einfügen:
class bases_client {
file = "core\bases";
class base_config {};
class base_jail {};
class create_base {};
class delete_bought_object {};
class gang_get_rank {};
class get_all_bought_objects {};
class get_base_conf {};
class get_base_player {};
class get_base_rent {};
class getMaxBaseLevel {};
class init_bases_client {};
class monitor_base_object_placing {};
class object_add_addaction {};
class pay_with_gang_bank {};
class place_base_object {};
class preview_base {};
class sell_base {};
class upgradeBaseInProgress {};
class exp_hint {};
class circleVehicleShow {};
class mresArray {};
class mresString {};
class mresToArray {};
class numberSafe {};
class stand_up_seat {};
class take_seat {};
};
class bases_client_dialog {
file = "core\bases\dialog_functions";
class admin_force_material {};
class base_build_dialog_buy {};
class base_build_dialog_demo {};
class base_build_dialog_open {};
class ClaimBTN_base_apply_dialog {};
class EVH_base_apply_dialog {};
class materialRET_base_storage_dialog {};
class materialRET_base_storage_dialog_rent {};
class open_base_apply_dialog {};
class open_base_storage_dialog {};
class open_base_storage_dialog_rent {};
class prepare_base_level_up {};
class store_action_base_storage_dialog {};
class sync_building_mats_toServer {};
class update_base_storage_dialog {};
};
Alles anzeigen
17. Ihr ersetzt in der "Altis_Life.Altis\core\functions\fn_keyhandler.sqf" folgendes:
//T Key (Trunk)
case 20: {
if (!_alt && {!_ctrlKey} && {!dialog} && {!life_action_inUse} && {!(player getVariable ["playerSurrender",false])} && {!(player getVariable ["restrained",false])} && {!life_isknocked} && {!life_istazed}) then {
if (!(isNull objectParent player) && alive vehicle player) then {
if ((vehicle player) in life_vehicles) then {
[vehicle player] spawn life_fnc_openInventory;
};
} else {
private "_list";
_list = ((ASLtoATL (getPosASL player)) nearEntities [["Box_IND_Grenades_F","B_supplyCrate_F"], 2.5]) select 0;
if (!(isNil "_list")) then {
_house = nearestObject [(ASLtoATL (getPosASL _list)), "House"];
if (_house getVariable ["locked", false]) then {
hint localize "STR_House_ContainerDeny";
} else {
[_list] spawn life_fnc_openInventory;
};
} else {
_list = ["landVehicle","Air","Ship"];
if (KINDOF_ARRAY(cursorObject,_list) && {player distance cursorObject < 7} && {isNull objectParent player} && {alive cursorObject} && {!life_action_inUse}) then {
if (cursorObject in life_vehicles || {locked cursorObject isEqualTo 0}) then {
[cursorObject] spawn life_fnc_openInventory;
};
};
};
};
};
};
Alles anzeigen
durch:
//T Key (Trunk)
case 20: {
if (!_alt && {!_ctrlKey} && {!dialog} && {!life_action_inUse} && {!(player getVariable ["playerSurrender",false])} && {!(player getVariable ["restrained",false])} && {!life_isknocked} && {!life_istazed}) then {
if (!(isNull objectParent player) && alive vehicle player) then {
if ((vehicle player) in life_vehicles) then {
[vehicle player] spawn life_fnc_openInventory;
};
} else {
private "_list";
_list = ((ASLtoATL (getPosASL player)) nearEntities [["Box_IND_Grenades_F","B_supplyCrate_F"], 2.5]) select 0;
if (!(isNil "_list")) then {
_house = nearestObject [(ASLtoATL (getPosASL _list)), "House"];
if (_house getVariable ["locked", false]) then {
hint localize "STR_House_ContainerDeny";
} else {
[_list] spawn life_fnc_openInventory;
};
} else {
_list = ["landVehicle","Air","Ship"];
if (KINDOF_ARRAY(cursorObject,_list) && {player distance cursorObject < 7} && {isNull objectParent player} && {alive cursorObject} && {!life_action_inUse}) then {
if (cursorObject in life_vehicles || {locked cursorObject isEqualTo 0}) then {
[cursorObject] spawn life_fnc_openInventory;
};
};
};
if((typeof cursorObject) in ["Box_IND_Grenades_F","B_supplyCrate_F"] && cursorObject getVariable["LIFE_BASE_OBJECT_ID",-1] >= 0) then {
[cursorObject] spawn life_fnc_openInventory;
};
};
};
};
Alles anzeigen
18. Ihr kopiert den Ordner "bases" aus der ZIP in "Altis_Life.Altis\dialog\".
19. Wir gehen in die "MasterHandler.hpp" in "Altis_Life.Altis\dialog\" und fügen ganz unten folgendes ein:
// Base Dialogs
#include "bases\base_apply.hpp"
#include "bases\base_build_dialog.hpp"
#include "bases\base_info_dialog.hpp"
#include "bases\base_storage_dialog.hpp"
// Base Dialogs end
20. In "Altis_Life.Altis\core\init.sqf" über:
addMissionEventHandler ["EachFrame", life_fnc_playerTags];
addMissionEventHandler ["EachFrame", life_fnc_revealObjects];
folgendes einfügen:
21. In der CfgRemoteexec folgende Funktionen einfügen:
// BASES START
F(life_fnc_upgradeBaseInProgress,ANYONE)
F(BIS_fnc_dynamicText,ANYONE)
F(life_fnc_create_base,ANYONE)
F(life_fnc_object_add_addaction,ANYONE)
F(life_fnc_materialRET_base_storage_dialog,CLIENT)
F(life_fnc_materialRET_base_storage_dialog_rent,CLIENT)
F(life_fnc_baseLevelUp,SERVER)
F(life_fnc_base_material_request,SERVER)
F(life_fnc_sync_base_material,SERVER)
F(life_fnc_base_rental_sync,SERVER)
F(life_fnc_delete_base_object,SERVER)
F(life_fnc_update_base_object,SERVER)
F(life_fnc_basedelete_fromgang,SERVER)
F(life_fnc_insert_base_object,SERVER)
// BASES END
Alles anzeigen
22. unsafeCVL in der "description.ext" muss auf 1 stehen.
FIN. Damit könnt ihr jetzt das System und die Standard-Basen nutzen
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Wie fügt man neue Basen ein? (Das ist vll jetzt keine krass ausführliche Erklärung aber das würde mir zu lange dauern, sry )
Ihr baut eine Basis im Editor(halt auf der Karte auf der euer Server ist und an der Position an der die Basis sein soll).
Ihr setzt diese Variablen auf die Objekte die diese brauchen:
this setvariable["Server",true]; // Das objekt muss vom Server erstellt werden z.B. Türme wegen ihrer Türen und Fenster
this setvariable["sim",true]; // Die Simulation von diesem Objekt muss eingeschaltet bleiben z.B. bei Lamepn
this setvariable["disallowdamage",true]; // solltet ihr mal ein objekt haben bei dem ihr den Damage anstellen wollt auf true setzen - standard ist halt off
this setvariable["not",true]; // ein Objekt mit dieser Variable mit nicht beachtet und nicht in die Variable "arr" eingetragen
Jetzt stellt ihr euch in die Mitte der Basis und führt folgendes aus:
arr = [];
_objekte = nearestobjects[player,["ALL"],200]; // passt diesen radius so an wie ihr in braucht
_objekte = _objekte - [player];
{
if!(_x getvariable["not",false]) then {
if!(typeof _x in ["Rabbit_F","Snake_random_F"]) then {
if(_x getvariable["Server",false] && _x getvariable["sim",false]) then {
if(_x getvariable["disallowdamage",false]) then {
arr pushback [typeof _x,getposatl _x,getdir _x,[],[],true,true,"",true,[vectordir _x,vectorUp _x]];
}else {
arr pushback [typeof _x,getposatl _x,getdir _x,[],[],true,true,"",false,[vectordir _x,vectorUp _x]];
};
} else {
if(_x getvariable["Server",false]) then {
if(_x getvariable["disallowdamage",false]) then {
arr pushback [typeof _x,getposatl _x,getdir _x,[],[],false,true,"",true,[vectordir _x,vectorUp _x]];
}else {
arr pushback [typeof _x,getposatl _x,getdir _x,[],[],false,true,"",false,[vectordir _x,vectorUp _x]];
};
};
if(_x getvariable["sim",false]) then {
if(_x getvariable["disallowdamage",false]) then {
arr pushback [typeof _x,getposatl _x,getdir _x,[],[],true,false,"",true,[vectordir _x,vectorUp _x]];
}else {
arr pushback [typeof _x,getposatl _x,getdir _x,[],[],true,false,"",false,[vectordir _x,vectorUp _x]];
};
};
};
};
};
} foreach _objekte;
Alles anzeigen
Danach lest ihr die Variable arr aus und fügt ihren Inhalt in das entsprechende switch case statement in der fn_base_config.sqf ein.
Die ID aus dem "bases-table" weist diesen Eintrag in der DB der Config in der base_config.sqf zu.
D.h. solltet ihr eine neue Basis machen wollen und die alten behalten wollen erstellt ihr eine neue Zeile mit der ID 8 und fügt inder fn_base_config.sqf noch ein case-statement mit dem argument 8 ein.
Dort fügt ihr dann die configs für diese Base ein.
In der fn_Base_config.sqf in Zeile 252 und höher findet ihr Kommentare die euch hoffentlich weiterhelfen.
Ansonsten könnt ihr auch nocht Einstellungen in der Bases_config.hpp ändern.
MfG Barney
Nochmal ein Nachtrag von mir, das mit der 'contravention' Spalte hatte ich gar nicht gesehen .
Also:
Das TUT ist schonmal komisch, in der fn_spawnVehicle.sqf liest er die contravention-Spalte aus, die aber in dem gegebenem SQL-Code nicht erstellt wird.
Es gibt auch im TUT keine Funktion die diese Spalte überhaupt updated o.Ä..
D.h. du machst jetzt folgendes:
Du gehst in die fn_spawnVehicle.sqf
Da machst du aus Z.31 (die so aussieht):
private _query = format ["SELECT id, side, classname, type, pid, alive, active, plate, color, inventory, gear, fuel, damage, blacklist, contravention FROM vehicles WHERE id='%1' AND pid='%2'",_vid,_pid];
das hier
private _query = format ["SELECT id, side, classname, type, pid, alive, active, plate, color, inventory, gear, fuel, damage, blacklist FROM vehicles WHERE id='%1' AND pid='%2'",_vid,_pid];
Als nächstes (immer noch in der fn_spawnVehicle.sqf) löscht du die Zeilen 194 und alle darüber(also alle Zeilen >= 194) raus.
Also das hier muss alles weg:
_contrav = (_vInfo select 14);
if (count _contrav isEqualTo 3) then {
_vehicle setVariable ["vehicle_immobilised",[(_contrav select 0),(_contrav select 1),parseNumber (_contrav select 2)],true];
};
Dann sollte es wieder funktionieren. Falls es dann immer noch net geht schreib einfach nochmal.
MfG Barney
Moin,
dir fehlt in der vehicles Tabelle der DB die Spalte Owner, einfach den Code aus dem TUT für die DB nochmal ausführen. (Denk aber dran dies wird alle bisherigen Einträge in der Tabelle löschen und eine neue Anlegen, wenn das ein Problem ist Spalte mit 'Alter Table' hinzufügen mit Standardwerten oder was auch immer)
DROP TABLE IF EXISTS `vehicles`;
CREATE TABLE `vehicles` (
`id` int(6) NOT NULL AUTO_INCREMENT,
`side` varchar(16) NOT NULL,
`classname` varchar(64) NOT NULL,
`type` varchar(16) NOT NULL,
`pid` varchar(17) NOT NULL,
`alive` tinyint(1) NOT NULL DEFAULT '1',
`blacklist` tinyint(1) NOT NULL DEFAULT '0',
`active` tinyint(1) NOT NULL DEFAULT '0',
`plate` varchar(16) NOT NULL,
`owner` varchar(64) NOT NULL,
`color` int(20) NOT NULL,
`inventory` text NOT NULL,
`gear` text NOT NULL,
`fuel` double NOT NULL DEFAULT '1',
`damage` varchar(256) NOT NULL,
`insert_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `side` (`side`),
KEY `pid` (`pid`),
KEY `type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=2;
Alles anzeigen
Am Schluss noch ein Wort der Warnung damit dir/euch ähnliche Probleme nicht passieren. Ich hatte damals für unseren Server das Gruppensystem umgeschrieben um auch Namen von Leuten die offline sind anzeigen zu lassen(und noch mehr), das gab allerdings teilweise Probleme weil manche Leute Sonderzeichen in ihrem Namen hatten mit denen extdb3 nicht besonders gut klargekommen ist. Als Lösung dafür habe ich dann ein Filter eingebaut, der den Namen eines jeden Spielers scant der joint und Spieler mit unzulässigen Zeichen im Namen blockt programmiert. Warum ich das noch dazu schreibe? Ich hab nur gesehen, dass ihr jetzt auch eine Owner Spalte mit dem Namen des Spielers drinnen habt, solltet ihr den irgendwann man ingame auslesen empfehle ich euch die Spielernamen ähnlich zu beschränken.
MfG Barney
Could you please post the extDB3 logs, the .rpt logs of the Server, the client and the receiver client(the person you try to give the coplevel)?
Ty
Also hast du die nicht geprüft? Du musst dich nur in das Auto setzen und die beiden Bedingungen unten in die Ansehen-Spalten der Debug Konsole kopieren . Wo hast du die Sachen denn hier, poste bitte mal nen Link.
Hast du die Bedingungen geprüft? Weil wenn die nämlich für das Fahrzeug false oder leer sind brauche ich keinen Fehler zu suchen
Das Fahrzeug das du benutzt um das zu testen ist dafür auch whitelisted?
Also diese beiden Bedingungen dürfen nicht false oder leer sein wenn du im Fahrzeug sitzt:
(typeof vehicle player) in emergLight_vehicles
getArray(missionConfigFile >> "emergLightVehicles" >> (typeof vehicle player) >> "pos")
Funktioniert das Platzieren der Leuchte aufm Auto? Also wird bei H das Ding korrekt aufs Auto attached?
Also du müsstest mal klarstellen, was du mit aufsteck blaulicht meinst, welche funktion das ist usw. Was du mit zweitenblaulichter vom van meinst ist mir ebenfalls schleierhaft?
Also du hast die Kombination STRG + H um die life_fnc_lights zu callen und SHIFT + L für [_veh] remoteExec ["life_fnc_lightsOn",0]; bzw. [_veh] call life_fnc_sirenLights; .
Was mir dazu erstmal ins Auge springt, ist dass du bei case 38 (Z. 199) nirgendwo _veh definierst wie du es in case 35 (Z.188) machst. D.h. zwischen Zeile 199 und 200 _veh definieren. Z.B. so wie ein Case Statement drüber: private _veh = vehicle player;
!ACHTUNG UMSTRITTENE MEINUNG! (Meinungen können von Person zu Person unterschiedlich sein bei Risiken und Nebenwirkungen fragen Sie ihren Arzt oder Apotheker)
Auf einem Server der Infistar benutzt würde ich sowieso nicht spielen, das Vorhandensein von Infistar heißt für mich halt immer das die Admins evtl. nicht ganz so viel Ahnung haben. (DAS IST NICHT BÖSE GEMEINT, echt nicht)
Aber so wie ich das aus dem Text den du geschrieben hast verstehe, wurdest du grundlos gebannt wegen etwas, was mal irgendwann auf einem Discord Server passiert ist?
Habe ich das richtig verstanden?
22:40:16 Scripting function 'ton_fnc_setobjvar' is not allowed to be remotely executed
Also in der Altis life Version ist es so, dass diese Funktion nicht in der functions.sqf definiert wird sondern als fn_setObjVar aufm Server vorhanden ist. In der Version die man hier downloaden kann ist auch alles in Ordnung, die Datei ist da(bei euch btw auch) und die ist auch korrekt in der CfgRemoteexec eingetragen. Dies ist bei euch aber anscheinend nicht der Fall.
Original Eintrag CfgRemoteexec:
F(TON_fnc_setObjVar,SERVER)
Das scheint bei euch wohl zu fehlen. Wie gesagt, hab mich gestern geirrt ich war davon überzeugt, dass die Funktion in der functions.sqf definiert wird. Die Änderungen die ich euch genannt habe gestern könnt ihr aber trotzdem so lassen, das funktioniert trotzdem alles.
MfG Barney