wenn das dass Bild aus der Galerie ist, frag doch einfach mal den author
Bin leider gerade am Handy
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.
wenn das dass Bild aus der Galerie ist, frag doch einfach mal den author
Bin leider gerade am Handy
Entweder bin ich gerade dumm oder weiß nicht was du meinst.
Kannst du mir das ein wenig erläutern was du genau meinst ?
Im Prinzip kannst du den Aufruf des Menüs aus der Playerinv wie Joe Barbaro geschrieben hat in eine addAction in der init. des Objektes mithilfe des Editors erstellen.
Wenn ich gleich nach Hause komme poste ich hier mal was
Es war nicht alleine ein Schnipsel, deshalb war ich mir nicht sicher Alice Kingsleigh
BlueType ja, ich darf dies. Da ich dieses System entwickelt habe und es nicht als vollständiges System auf SeaLife war
Moin NN,
da sich viele Menschen fragen, wie man ein Archivement System
entwickelt hier ein kleiner Anfang.
Zu Beachten: Dies ist nur ein Anfang (Schnipsel), es ist kein komplettes Tutorial.
ebenfalls ist die Ausarbeitung mit Dialog und so schlecht, ihr solltet es so nicht benutzen sondern nur als Hilfestellung nehmen, da ich wenig Zeit habe, kann ich leider kein komplettes erstellen
Schritt 1:
Wir legen eine Config namens Config_Archivements.hpp an
/*
Author: Natic
*/
class cfgArchives
{
class ticket {
variable = "archiv_ticket";
titel = "Strafzettel";
side = "cop";
description = "<t size='1'>Vergebe: %2 Strafzettel <br/>Vergebene Strafzettel: %1 </t>";
class level_1 {
needed = 100;
archiv = "Streifenbulle";
};
class level_2 {
needed = 300;
archiv = "Hüter der Bürger";
};
class level_3 {
needed = 800;
archiv = "Kaufhauscop";
};
class level_4 {
needed = 2500;
archiv = "König der Hüter";
};
class level_5 {
needed = 5000;
archiv = "König der Könige";
};
};
};
Alles anzeigen
Schritt 2:
Wir gehen in die Datei: fn_ticketGive.sqf und ersetzen diese mit
#include "..\..\script_macros.hpp"
/*
File: fn_ticketGive.sqf
Author: Bryan "Tonic" Boardwine
Modified by: Natic
Description:
Gives a ticket to the targeted player.
*/
private ["_val","_ticketcount"];
if (isNil "life_ticket_unit") exitWith {["Keine Person","Person für das Ticket ist nil!", true, "fast"] spawn ESG_fnc_notify;};
if (isNull life_ticket_unit) exitWith {["Keine Person","Die Person für das Ticket gibt es nicht!", true, "fast"] spawn ESG_fnc_notify;};
_val = ctrlText 2652;
_ticketcount = 0;
if (!([_val] call TON_fnc_isnumber)) exitWith {["Keine Zahl","Du hast keine echte Zahl eingegeben!", true, "fast"] spawn ESG_fnc_notify;};
if ((parseNumber _val) > 500000) exitWith {["Zu hohes Bußgeld","Strafzettel können nicht mehr als $500.000 betragen!", true, "fast"] spawn ESG_fnc_notify;};
if (playerside isEqualTo west)then {
[0,"STR_Cop_TicketGive",true,[profileName,[(parseNumber _val)] call life_fnc_numberText,life_ticket_unit getVariable ["realname",name life_ticket_unit]]] remoteExecCall ["life_fnc_broadcast",RCLIENT];
}
else
{
[0,"STR_Med_TicketGive",true,[profileName,[(parseNumber _val)] call life_fnc_numberText,life_ticket_unit getVariable ["realname",name life_ticket_unit]]] remoteExecCall ["life_fnc_broadcast",RCLIENT];
};
[player,(parseNumber _val)] remoteExec ["life_fnc_ticketPrompt",life_ticket_unit];
closeDialog 0;
_ticketcount = _ticketcount + 1;
private ["_lvl_1","_lvl_2","_lvl_3","_lvl_4","_lvl_5"];
_lvl_1 = getText(missionConfigFile >>"cfgArchives" >> "tickets" >> "level_1","archiv");
_lvl_2 = getText(missionConfigFile >>"cfgArchives" >> "tickets" >> "level_2","archiv");
_lvl_3 = getText(missionConfigFile >>"cfgArchives" >> "tickets" >> "level_3","archiv");
_lvl_4 = getText(missionConfigFile >>"cfgArchives" >> "tickets" >> "level_4","archiv");
_lvl_5 = getText(missionConfigFile >>"cfgArchives" >> "tickets" >> "level_5","archiv");
if (_ticketcount == 100) then {
if (getNumber(missionConfigFile >>"cfgArchives" >> "tickets" >> "level_1","needed")) then {
lbAdd [100100, "%1",_lvl_1];
};
};
if (_ticketcount == 300) then {
if (getNumber(missionConfigFile >>"cfgArchives" >> "tickets" >> "level_1","needed")) then {
lbAdd [100100, "%1",_lvl_2];
};
};
if (_ticketcount == 800) then {
if (getNumber(missionConfigFile >>"cfgArchives" >> "tickets" >> "level_1","needed")) then {
lbAdd [100100, "%1",_lvl_3];
};
};
if (_ticketcount == 2500) then {
if (getNumber(missionConfigFile >>"cfgArchives" >> "tickets" >> "level_1","needed")) then {
lbAdd [100100, "%1",_lvl_4];
};
};
if (_ticketcount == 5000) then {
if (getNumber(missionConfigFile >>"cfgArchives" >> "tickets" >> "level_1","needed")) then {
lbAdd [100100, "%1",_lvl_5];
};
};
Alles anzeigen
Schritt3: Wir erstellen ein Dialog:
/*
Author: Natic
*/
class sealife_archivements {
idd = 100100;
name = "sealife_archivements";
onLoad = "";
onUnLoad = "";
movingEnable = false;
enableSimulation = false;
class controlsBackground {
class bg: Life_RscPicture
{
idc = -1;
text = "ure\misc\bg_menu.paa";
x = 0.17 * safezoneW + safezoneX;
y = 0.115 * safezoneH + safezoneY;
w = 0.665156 * safezoneW;
h = 0.693 * safezoneH;
ColorBackground[] = {0.784313,0.784313,0.784313,0};
ColorText[] = {0,0,0,1};
};
class title: Life_RscStructuredText
{
idc = 5999;
text = "<t align'right' font'PuristaBold' size'1.5'>Archivements</t>";
x = 0.412621 * safezoneW + safezoneX;
y = 0.169549 * safezoneH + safezoneY;
w = 0.154687 * safezoneW;
h = 0.033 * safezoneH;
ColorBackground[] = {0,0,0,0};
};
};
class controls {
class btn_submit: Life_RscButtonMenu
{
idc = 2400;
text = "Schließen";
onButtonClick = "";
x = 0.647855 * safezoneW + safezoneX;
y = 0.034475 * safezoneH + safezoneY;
w = 0.221719 * safezoneW;
h = 0.055 * safezoneH;
ColorBackground[] = {0.145098,0.145098,0.145098,1};
ColorText[] = {1,1,1,1};
};
class archives_list: Life_RscListbox
{
idc = 100101;
x = 0.209235 * safezoneW + safezoneX;
y = 0.232345 * safezoneH + safezoneY;
w = 0.752604 * safezoneW;
h = 0.722222 * safezoneH;
ColorBackground[] = {0,0,0,0.705882};
ColorText[] = {1,1,1,1};
colorSelectBackground[] = {0,0,0,1};
colorSelect[] = {0,0,0,1};
};
};
};
Alles anzeigen
Ich hoffe ich konnte euch ggf. Helfen
viel spaß
Es wurde eine normale Windows Form Anwendung verwendet und keine WPF Anwendung.
Dennoch kann das Programm in WÖF übertragen werden
deshalb sagte ich, eine Lösung wäre bat datei schreiben, oder launcher programmieren die beim start den chache löscht
Wie blackfisch sagte, bleibt es kostenlos.
Für extra Anpassungen kann man über einen Betrag auch sprechen. Grundsätzlich sind die 49.99 auf einer Version bezogen, die nichts mit Arma zu tun hat, sondern wirklich für richtige Firmen.
Da dennoch einige Communitys kleine Änderungen wollen, können diese durch kleine Beträge angepasst werden.
Zum Thema Webseite und technicZone
Die Webseite ist deshalb nicht online, da die in Arbeit ist, ebenfalls ist noch nichts online, auch nicht die Software;)
Und ja Julian es ist in C# ich Programmier Anwendungen nur damit
#INFORMATION
Die o.g. Software wird in 3 Kategorien eingeteilt.
Die Community-Verwaltung für eine Arma3 Communtiy wie die Bilder es zeigen, wird
Kostenlos.
Die Extra Funktionen, Firmenverwaltung beträgt Jährlich 49.99€
Die Community-Verwaltung außerhalb der Arma Community beträgt ggf. 29.99€
Ich weiß, jetzt will ich für andere Dinge wieder Geld. Doch die Firmensoftware Beispielsweise
ergibt einer wirklichen Firma wie (ÜBERTRIEBEN) Apple, Samsung viele Vorteile.
Da ist der Jährliche Preis von 49.99€ angemessen.
MfG
Natic
es liegt daran da du schon die Mission mit dem selben Namen im Cache hast, da aber jetzt Änderungen stattgefunden haben geht es nicht mehr also entweder Neustarten oder Namen ändern
Du kannst es ändert, in dem du immer die Mission umbenennst, im Prinzip kannst du eine bat oder sh Datei erstellen die die Pbo immer umbenennt Beispiel:
Server.V.1.Altis
Bzw selbst umbenenne wenn du Änderungen gemacht hast
Entweder bin ich dumm, oder das ist hier nicht der richtige Bereich
Tricey das ist eine gute Frage, dass weiß ich leider noch nicht.
Man wird aber aber Namen die jeweils oben Angegeben sind ändert können uns zwischen 2 Designs wählen. ich werde eventuell ein Editor einbauen das man
das Design via Templates ändern kann
Sieht gut aus!
Vielen Dank
hätte mega Interesse^^
Es wird sobald es fertig ist online gehen
Diese Tool wird aber nach Zeit Lust und Laune gemacht
Moin NN,
ich entwickelte eine Verwaltungssoftware für das Sealife Projekt.
Da ich bei diesem Projekt nicht mehr bin, möchte ich dieses fertig stellen und euch zu Verfügung stellen.
Funktionen der Software
Das Tool ist ja mit der Datenbank verbunden, aber wie?
==> Alle Abläufe die über wichtige Daten laufen, sind über eine Verschlüsselung bzw API gesteuert.
Wie kriege ich das Tool?
==> Es wird sobald es fertig ist, hier kostenlos zu Verfügung gestellt
Kostenlos geillll
==> Ja, Kostenlos, die Community versagt schon so...
Kann man auf Wunsch mehr Funktionen einbauen?
=> Aktuell kann dies noch nicht für jeden selbst gemacht werden, für das Tool kommen aber Updates (Tool updatet sich selbst)
=> Es wird ein Plugin Verwalter kommen, wo man Plugins einfügen kann
Hier ein paar Bilder:
Das Bilder hochladen hat anders nicht funktioniert ... sry...
MfG
Natic
Beitrag wird stets weiterentwickelt...
Moin NN,
da die Programmiersprache C# sehr vielfältig ist, habe ich mir überlegt euch eine kleine Einführung
in C# zu machen.
Ihr solltet beachten, dass es keine völlig Ausführliche Anleitung ist, sondern nur eine kleine Information.
Ich werde diesen Beitrag aber Stück für Stück erweitern.
Ebenfalls empfehle ich Menschen die C# von Grund auf lernen wollen das Microsoft Visual C# 2010 - Das Entwicklerbuch
STAND: 13.03.2019 | 17:30
reiner Programmcode einer Windows Form Anwendung:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
Beschreibung des o.g. Codes:
- Abkürzung: C# Dateiendung ist .cs
- using ...: bindet weitere Komponenten ein, diese können manuell hinzugefügt werden, oder von den Automatisch Installierten Anwendung Erweiterungen hinzugefügt werden.
- namespace: Dies ist eure Programmname, solltet ihr euer Programm 123456789 benennen, wird
der namespace zu 123456789 benannt. weiteres zum Namespace folgt.
- public partial class Form1 : Form: dies ruft die Form 1 auf, diese könnt ihr ebenfalls einen xy Namen geben. Hier könnt ihr z.B Globale Variablen speichern, diese könnt ihr dann im gesamten Programm aufrufen.
- ACHTUNG: Dies sind keine vollständigen Informationen zum Code!
Binär/Dezimal/Hexadezimal - System:
Binär zu Dezimal
0 1 1 0
man liest den 0110 Code von Rechts nach links
hier die jeweiligen Stellen
8 4 2 1
somit ist der Code 0110
4+2 = 6
Wir haben aus Binär auf Dezimal umgewandelt
Dezimal in Binär
Zahl: 6
Hierzu wird die Module Division angewendet,
die Umwandlungen sind in der reinen Programmierung nicht nötig zum Anwenden, trotzdem sollte man verstehen, wie
das ganze Abläuft, erst dann sollte man weiter gehen und die weiteren Schritte lernen.
Video folgt..
Variablen & Typen:
Meist verwendete Typen:
- string => Für Buchstaben wie z.B string = "DeinPasswort"
- int => ganze Zahlen => 0,1,2,3,4,5,6,7,8,9 ...
- bool => Zeichen => true oder false
- char => Wahrheitswerte
- var => Typ wird vom Compiler festgelegt => Bsp: var webserver = new Webserver();
- float => Kommazahlen => 0.5 ...
- decimal => 128 Bit, Bereich mindestens -7,9 × 10-28 bis 7,9 x 1028, mit einer Genauigkeit von mindestens 28 Stellen
Dann gibt es noch bestimmte Typen (Ganzzahlig mit Vorzeichen)
- sbyte => Bit -128 bis 127
- short => 16 Bit, Bereich von -32.768 bis 32.767
- long => 64 Bit, Bereich von -9.223.372.036.854.775.808 bis
Ganzzahlig ohne Vorzeichen
- byte => 8 Bit, Bereich von -0 bis 255
-ushort => 16 Bit, Bereich von 0 bis 65.535
-uint => 32 Bit, Bereich von 0 bis 4.294.967.295
- ulong => 64 Bit, Bereich von 0 bis 18.446.744.073.709.551.615
Operatoren:
Arithematische operatoren
+ Addition
- subtrahieren
* Multiplikation
/ Division
Zuweisungsoperatoren
> größer als
< kleiner als
<= kleiner gleich
>= größer gleich
= Wert Zuweisung
== Gleich
!= ungleich
Zusammen - Gesetze - Operatoren
Bei den Z-G-Operatoreen könnt ihr nur ein Arithematische Operator und einen Zuweisungs Operator benutzen.
Beispiel:
i += 1 //Dies entspricht, dass i + 1 und = 1 ist.
Kl. Beispiele:
bool i = true;
if (!= i) //Wenn i false ist //Wegen Ungleich
Präfix und Postfix:
Präfix und Postfix nehmen die Variablen immer + oder -
Beispiel:
if (i >= 10)
++i
Sollte i größer oder gleich 10 sein, wird die Zahl 10 zuerst + genommen
Bei i++ sprich das ++ hinter der Variable nimmt erst nach dem 10 erreicht ist +. Dies wird in einem Video nochmal besser erklärt.
Das selbse Prinzip gibt es auch mit --
Postfix --i und Präfix i--
Also Postfix ist immer vor und Präfix hinter der Variable
Formatierungszeichen:
\\ Backslash
\n neue Zeile
\b Backspace
\t Tabulator
Block-Anweisung und Schleifen erstellen:
Block-Anweisung:
bei einer Blockanweisung / Schleife gibt es die Bedingung, die Initialisierung und die reinitialisierung.
int Name = zuweisung
if (Bedingung) {
... } else { ...}
While-Schleife:
Do-While Schleife:
do while Schleife
int i = 0; //initialisierung (Variable Zuweisung)
do {
Console.Writeline(i) //ausgabe
i += 2; //Reinitialisierung
} while (i <= 10); //Bedingung
For-Schleife
for (i = 10; i >= 0; --i)
{
Console.WriteLine(i);
}
ich werde diesen Beitrag jeden Tag erweitern.
#UPDATE
Moin NN,
das Text in Bits und Bits in Text umgewandelt werden habe ich mit einer selbst zusammen gedachte Methode nun geschafft.
Doch zurzeit habe ich den Text / die Bits in einer Variable gespeichert, doch die Bits sollen ja von dem Scanner empfangen und dort gespeichert werden,
wisst ihr wie ich Abfrage, welche bits der Scanner empfangen hat?
Moin,
Ich würde gerne die empfangenen 0 und 1 des Scanners in Text angezeigt bekommen. Wie ich 0 und 1 in Text wandle weiß ich, doch wisst ihr, wie ich den angesprochenen Scanner die Werte Abfrage? Hier der Code:
Main.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WIATest;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Scannerapplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//button click event
private void btn_scan_Click(object sender, EventArgs e)
{
MessageBox.Show("Die Verbindung muss bei jedem neustart erfolgen!");
try
{
//get list of devices available
List<string> devices = WIAScanner.GetDevices();
foreach (string device in devices)
{
lbDevices.Items.Add(device);
}
//check if device is not available
if (lbDevices.Items.Count == 0)
{
MessageBox.Show("Es wurden keine WIA Scanner gefunden");
}
else
{
lbDevices.SelectedIndex = 0;
}
//get images from scanner
List<Image> images = WIAScanner.Scan((string)lbDevices.SelectedItem);
foreach (Image image in images)
{
pic_scan.Image = image;
pic_scan.Show();
pic_scan.SizeMode = PictureBoxSizeMode.StretchImage;
//save scanned image into specific folder
image.Save(@"E:\" + DateTime.Now.ToString("yyyy-MM-dd HHmmss") + ".jpeg", ImageFormat.Jpeg);
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
private void Home_SizeChanged(object sender, EventArgs e)
{
int pheight = this.Size.Height - 153;
pic_scan.Size = new Size(pheight - 150, pheight);
}
private void btn_start_Click(object sender, EventArgs e)
{
WebServer ws = new WebServer(SendResponse, "http://localhost:8080/index/");
ws.Run();
}
public static string SendResponse(HttpListenerRequest request)
{
return string.Format("<HTML><BODY>BinaryDP<br>{0}</BODY></HTML>", DateTime.Now);
}
}
}
Alles anzeigen
Klasse für den Scanner
using System;
using System.Collections.Generic;
using System.IO;
using System.Drawing;
namespace WIATest
{
class WIAScanner
{
const string wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}";
class WIA_DPS_DOCUMENT_HANDLING_SELECT
{
public const uint FEEDER = 0x00000001;
public const uint FLATBED = 0x00000002;
}
class WIA_DPS_DOCUMENT_HANDLING_STATUS
{
public const uint FEED_READY = 0x00000001;
}
class WIA_PROPERTIES
{
public const uint WIA_RESERVED_FOR_NEW_PROPS = 1024;
public const uint WIA_DIP_FIRST = 2;
public const uint WIA_DPA_FIRST = WIA_DIP_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
public const uint WIA_DPC_FIRST = WIA_DPA_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
//
// Scanner only device properties (DPS)
//
public const uint WIA_DPS_FIRST = WIA_DPC_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
public const uint WIA_DPS_DOCUMENT_HANDLING_STATUS = WIA_DPS_FIRST + 13;
public const uint WIA_DPS_DOCUMENT_HANDLING_SELECT = WIA_DPS_FIRST + 14;
}
/// <summary>
/// Use scanner to scan an image (with user selecting the scanner from a dialog).
/// </summary>
/// <returns>Scanned images.</returns>
public static List<Image> Scan()
{
WIA.ICommonDialog dialog = new WIA.CommonDialog();
WIA.Device device = dialog.ShowSelectDevice(WIA.WiaDeviceType.UnspecifiedDeviceType, true, false);
if (device != null)
{
return Scan(device.DeviceID);
}
else
{
throw new Exception("You must select a device for scanning.");
}
}
/// <summary>
/// Use scanner to scan an image (scanner is selected by its unique id).
/// </summary>
/// <param name="scannerName"></param>
/// <returns>Scanned images.</returns>
public static List<Image> Scan(string scannerId)
{
List<Image> images = new List<Image>();
bool hasMorePages = true;
while (hasMorePages)
{
// select the correct scanner using the provided scannerId parameter
WIA.DeviceManager manager = new WIA.DeviceManager();
WIA.Device device = null;
foreach (WIA.DeviceInfo info in manager.DeviceInfos)
{
if (info.DeviceID == scannerId)
{
// connect to scanner
device = info.Connect();
break;
}
}
// device was not found
if (device == null)
{
// enumerate available devices
string availableDevices = "";
foreach (WIA.DeviceInfo info in manager.DeviceInfos)
{
availableDevices += info.DeviceID + "\n";
}
// show error with available devices
throw new Exception("The device with provided ID could not be found. Available Devices:\n" + availableDevices);
}
WIA.Item item = device.Items[1] as WIA.Item;
try
{
// scan image
WIA.ICommonDialog wiaCommonDialog = new WIA.CommonDialog();
WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, false);
// save to temp file
string fileName = Path.GetTempFileName();
File.Delete(fileName);
image.SaveFile(fileName);
image = null;
// add file to output list
images.Add(Image.FromFile(fileName));
}
catch (Exception exc)
{
throw exc;
}
finally
{
item = null;
//determine if there are any more pages waiting
WIA.Property documentHandlingSelect = null;
WIA.Property documentHandlingStatus = null;
foreach (WIA.Property prop in device.Properties)
{
if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_SELECT)
documentHandlingSelect = prop;
if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_STATUS)
documentHandlingStatus = prop;
}
// assume there are no more pages
hasMorePages = false;
// may not exist on flatbed scanner but required for feeder
if (documentHandlingSelect != null)
{
// check for document feeder
if ((Convert.ToUInt32(documentHandlingSelect.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_SELECT.FEEDER) != 0)
{
hasMorePages = ((Convert.ToUInt32(documentHandlingStatus.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_STATUS.FEED_READY) != 0);
}
}
}
}
return images;
}
/// <summary>
/// Gets the list of available WIA devices.
/// </summary>
/// <returns></returns>
public static List<string> GetDevices()
{
List<string> devices = new List<string>();
WIA.DeviceManager manager = new WIA.DeviceManager();
foreach (WIA.DeviceInfo info in manager.DeviceInfos)
{
devices.Add(info.DeviceID);
}
return devices;
}
}
}
Alles anzeigen