Development Team [DISCUSSION]
#1

Currently at my server, I'm the only scripter which causes the script to be delayed for a while before actual release, and imagine my server being big and me the only developer, this will cause problems.

So my question is, how can I recruit a development team w/o them being able to steal/leak the script?
Reply
#2

Legal agreement/contract (no idea how it's in english - that piece of paper you should sign with lawyer present or something) would win you a court case in case of theft. Splitting your code into multiple files, so other people only know the public api of other pieces. Obfuscation, runtime decryption, you name it. I don't know, I care only for my payment when working with someone, but if you hire "professionals" for admin rank/$10, don't be surprised your code is suddenly available for sale.
Reply
#3

You can't.

You can give them small tasks to do, provide the snippet, tell them what needs to be done, let them do it.
Reply
#4

I've written a tutorial on this in the past, the short answer is "YSI":

https://sampforum.blast.hk/showthread.php?tid=296907

Basically, you split your mode up in to logical pieces, such as streamer, vehicles, fishing job, etc. Each of these systems is in a separate file and all are included in to the main mode. However, you also include each system in to a separate filterscript and compile those individually. If you wrote your mode well (with minimal coupling between independent parts) this should be easy.

Anyway, the key to this is y_master, so you declare a function as:

pawn Code:
global MyFunc(whatever)
{
    // Do the code here...
}
And have a header include in which you "forward" all those functions (but not using "forward"):

pawn Code:
foreign MyFunc(whatever);
Your other scripters are given this header file and the compiled filterscript (which can also use "y_lock" and other script protections). The header means that they can include and call the functions, but the use of a filterscript means that they don't actually have the source of the functions and the use of "y_lock" means that they can only run the script on localhost.

The other advantage of this method is that when they send you their code, you can compile all the separate parts in to one huge script and not need to use the filterscripts and remote calls at all - without altering ANY code.

These links might also help:

https://sampforum.blast.hk/showthread.php?tid=194509 (old)
https://sampforum.blast.hk/showthread.php?tid=475106 (new)
Reply
#5

Quote:
Originally Posted by ColeMiner
View Post
I've written a tutorial on this in the past, the short answer is "YSI":

https://sampforum.blast.hk/showthread.php?tid=296907

Basically, you split your mode up in to logical pieces, such as streamer, vehicles, fishing job, etc. Each of these systems is in a separate file and all are included in to the main mode. However, you also include each system in to a separate filterscript and compile those individually. If you wrote your mode well (with minimal coupling between independent parts) this should be easy.

Anyway, the key to this is y_master, so you declare a function as:

pawn Code:
global MyFunc(whatever)
{
    // Do the code here...
}
And have a header include in which you "forward" all those functions (but not using "forward"):

pawn Code:
foreign MyFunc(whatever);
Your other scripters are given this header file and the compiled filterscript (which can also use "y_lock" and other script protections). The header means that they can include and call the functions, but the use of a filterscript means that they don't actually have the source of the functions and the use of "y_lock" means that they can only run the script on localhost.

The other advantage of this method is that when they send you their code, you can compile all the separate parts in to one huge script and not need to use the filterscripts and remote calls at all - without altering ANY code.

These links might also help:

https://sampforum.blast.hk/showthread.php?tid=194509 (old)
https://sampforum.blast.hk/showthread.php?tid=475106 (new)
I think that ColeMiner (Y_Less) has a point, YSI is probably yhe best system to use for script security, but I have another question, is there another way to give my script source code to 'developers' w/o having to email it/upload it to mediafire?
Reply
#6

Let them make filterscripts, only give them specific functions they'd require when developing their code.
Reply
#7

Quote:
Originally Posted by seanny
View Post
I think that ColeMiner (Y_Less) has a point, YSI is probably yhe best system to use for script security, but I have another question, is there another way to give my script source code to 'developers' w/o having to email it/upload it to mediafire?
You can send the files by Skype. It's pretty easy.
Reply
#8

Quote:
Originally Posted by LeGGGeNNdA
View Post
You can send the files by Skype. It's pretty easy.
Or Dropbox?
Reply
#9

GIT/SVN.
Reply
#10

I do something like this and give my gamemode.amx and this include which has a set of functions which other developers can use while writing a filterscript.These functions call the functions which are forwarded in my gamemode.Now anyone can write some code for me using my gamemode functions and without my code being exposed.
A part of the code is here:
Code:
ined XACNR_FILTERSCRIPT_ADMIN
	#if defined _ALS_SetPlayerHealth
	    #undef SetPlayerHealth
	#else
	    #define _ALS_SetPlayerHealth
	#endif

	#define SetPlayerHealth(%0,%1) CallRemoteFunction("AC_SetPlayerHealth","if",%0,%1)
	////////////////////////////////////////////////////////////////////////////////
	#if defined _ALS_SetPlayerArmour
	    #undef SetPlayerArmour
	#else
	    #define _ALS_SetPlayerArmour
	#endif

	#define SetPlayerArmour(%0,%1) CallRemoteFunction("AC_SetPlayerArmour","if",%0,%1)
	////////////////////////////////////////////////////////////////////////////////
    #if defined _ALS_PutPlayerInVehicle
	    #undef PutPlayerInVehicle
	#else
	    #define _ALS_PutPlayerInVehicle
	#endif

	#define PutPlayerInVehicle(%0,%1,%2) CallRemoteFunction("AC_PutPlayerInVehicle","iii",%0,%1,%2)
	////////////////////////////////////////////////////////////////////////////////
	#if defined _ALS_SetVehiclePos
	    #undef SetVehiclePos
	#else
	    #define _ALS_SetVehiclePos
	#endif

	#define SetVehiclePos(%0,%1,%2,%3) CallRemoteFunction("AC_SetVehiclePos","ifff",%0,%1,%2,%3)
	////////////////////////////////////////////////////////////////////////////////
	#if defined _ALS_TogglePlayerSpectating
	    #undef TogglePlayerSpectating
	#else
	    #define _ALS_TogglePlayerSpectating
	#endif

	#define TogglePlayerSpectating(%0,%1) CallRemoteFunction("AC_TogglePlayerSpectating","ii",%0,%1)
	////////////////////////////////////////////////////////////////////////////////
	#if defined _ALS_SetPlayerPos
	    #undef SetPlayerPos
	#else
	    #define _ALS_SetPlayerPos
	#endif

	#define SetPlayerPos(%0,%1,%2,%3) CallRemoteFunction("AC_SetPlayerPos","ifff",%0,%1,%2,%3)
	////////////////////////////////////////////////////////////////////////////////
	#if defined _ALS_SetPlayerPosFindZ
	    #undef SetPlayerPosFindZ
	#else
	    #define _ALS_SetPlayerPosFindZ
	#endif

	#define SetPlayerPosFindZ(%0,%1,%2,%3) CallRemoteFunction("AC_SetPlayerPosFindZ","ifff",%0,%1,%2,%3)
	////////////////////////////////////////////////////////////////////////////////
	#if defined _ALS_GivePlayerWeapon
	    #undef GivePlayerWeapon
	#else
	    #define _ALS_GivePlayerWeapon
	#endif

	#define GivePlayerWeapon(%0,%1,%2) CallRemoteFunction("AC_GivePlayerWeapon","iii",%0,%1,%2)
	////////////////////////////////////////////////////////////////////////////////
	#if defined _ALS_ResetPlayerWeapons
	    #undef ResetPlayerWeapons
	#else
	    #define _ALS_ResetPlayerWeapons
	#endif

	#define ResetPlayerWeapons(%0) CallRemoteFunction("AC_ResetPlayerWeapons","i",%0)
	////////////////////////////////////////////////////////////////////////////////
	#if defined _ALS_ResetPlayerMoney
	    #undef ResetPlayerMoney
	#else
	    #define _ALS_ResetPlayerMoney
	#endif

	#define ResetPlayerMoney(%0) CallRemoteFunction("AC_ResetPlayerMoney","i",%0)
	////////////////////////////////////////////////////////////////////////////////
	#if defined _ALS_GivePlayerMoney
	    #undef GivePlayerMoney
	#else
	    #define _ALS_GivePlayerMoney
	#endif

	#define GivePlayerMoney(%0,%1) CallRemoteFunction("AC_GivePlayerMoney","ii",%0,%1)
	////////////////////////////////////////////////////////////////////////////////
	#if defined _ALS_GetPlayerMoney
	    #undef GetPlayerMoney
	#else
	    #define _ALS_GetPlayerMoney
	#endif

	#define GetPlayerMoney(%0) CallRemoteFunction("AC_GetPlayerMoney","i",%0);
	////////////////////////////////////////////////////////////////////////////////
#endif
#if !defined XACNR_FILTERSCRIPT_VEHICLES
    #if defined _ALS_AddStaticVehicle
    #undef AddStaticVehicle
	#else
	    #define _ALS_AddStaticVehicle
	#endif

	#define AddStaticVehicle(%0,%1,%2,%3,%4,%5,%6) CallRemoteFunction("xacnr_AddStaticVehicle","iffffii",%0,%1,%2,%3,%4,%5,%6)

	#if defined _ALS_AddStaticVehicleEx
	    #undef AddStaticVehicleEx
	#else
	    #define _ALS_AddStaticVehicleEx
	#endif

	#define AddStaticVehicleEx(%0,%1,%2,%3,%4,%5,%6,%7) CallRemoteFunction("xacnr_AddStaticVehicleEx","iffffiii",%0,%1,%2,%3,%4,%5,%6,%7)

	#if defined _ALS_CreateVehicle
	    #undef CreateVehicle
	#else
	    #define _ALS_CreateVehicle
	#endif

	#define CreateVehicle(%0,%1,%2,%3,%4,%5,%6,%7) CallRemoteFunction("xacnr_CreateVehicle","iffffiii",%0,%1,%2,%3,%4,%5,%6,%7)

	#if defined _ALS_DestroyVehicle
	    #undef DestroyVehicle
	#else
	    #define _ALS_DestroyVehicle
	#endif

	#define DestroyVehicle(%0) CallRemoteFunction("xacnr_DestroyVehicle","i",%0)

	#if defined _ALS_ChangeVehicleColor
	    #undef ChangeVehicleColor
	#else
	    #define _ALS_ChangeVehicleColor
	#endif

	#define ChangeVehicleColor(%0,%1,%2) CallRemoteFunction("xacnr_ChangeVehicleColor","iii",%0,%1,%2)

	#if defined _ALS_SetVehicleFuel
	    #undef SetVehicleFuel
	#else
	    #define _ALS_SetVehicleFuel
	#endif

	#define SetVehicleFuel(%0,%1) CallRemoteFunction("xacnr_SetVehicleFuel","ii",%0,%1)
#endif
////////////////////////////////////////////////////////////////////////////////
#define API: API_
#define API_GetStartupTime(%0,%1,%2,%3) CallRemoteFunction("GetStartupTime","%s%s%i%i",%0,%1,%2,%3)
#define API_GetUserID(%0) CallRemoteFunction("GetUserID","i",%0)
#define API_XA_Kick(%0,%1,%2,%3) CallRemoteFunction("XA_Kick","issi",%0,%1,%2,%3)
#define API_HideBlockScreen(%0) CallRemoteFunction("HideBlockScreen","i",%0)
#define API_SetSpawnInformation(%0,%1,%2) CallRemoteFunction("SetSpawnInformation","iii",%0,%1,%2)
#define API_XA_SetPlayerColor(%0) CallRemoteFunction("XA_SetPlayerColor","i",%0)
#define API_ShowPlayerRules(%0) CallRemoteFunction("ShowPlayerRules","i",%0)
#define API_GiveMoneyToServer(%0,%1) CallRemoteFunction("GiveMoneyToServer","ii",%0,%1)
#define API_GiveMoneyFromServer(%0,%1) CallRemoteFunction("GiveMoneyFromServer","ii",%0,%1)
#define API_GiveSalaryToPlayer(%0,%1) CallRemoteFunction("GiveSalaryToPlayer","ii",%0,%1)
#define API_RemoveMoneyFromPlayer(%0,%1,%2) CallRemoteFunction("RemoveMoneyFromPlayer","iii",%0,%1,%2)
#define API_GiveMoneyToPlayer(%0,%1) CallRemoteFunction("GiveMoneyToPlayer","ii",%0,%1)
#define API_HideTextMessage(%0) CallRemoteFunction("HideTextMessage","i",%0)
#define API_ShowTextMessage(%0,%1) CallRemoteFunction("ShowTextMessage","is",%0,%1)
#define API_HideMidBoxMessage(%0) CallRemoteFunction("HideMidBoxMessage","i",%0)
#define API_ShowMidBoxMessage(%0,%1) CallRemoteFunction("ShowMidBoxMessage","ii",%0,%1)
#define API_ShowBlockScreen(%0,%1,%2) CallRemoteFunction("ShowBlockScreen","iss",%0,%1,%2)
#define API_HideXTextMenu(%0) CallRemoteFunction("HideXTextMenu","i",%0)
#define API_GetCurrentXTextMenu(%0) CallRemoteFunction("GetCurrentXTextMenu","i",%0)
#define API_DrawXTextMenu(%0,%1,%2,%3,%4,%5,%6,%7) CallRemoteFunction("DrawXTextMenu","iiissiii",%0,%1,%2,%3,%4,%5,%6,%7)
#define API_DrawXTextInfoBox(%0,%1,%2,%3,%4,%5,%6,%7) CallRemoteFunction("DrawXTextInfoBox","iiissiii",%0,%1,%2,%3,%4,%5,%6,%7)
#define API_GetCurrentXTextInfo(%0) CallRemoteFunction("GetCurrentXTextInfo","i",%0)
#define API_HideXTextInfo(%0) CallRemoteFunction("HideXTextInfo","i",%0)
#define API_GetPlayerXATeam(%0) CallRemoteFunction("GetPlayerXATeam","i",%0)
#define API_GiveScoreToPlayer(%0) CallRemoteFunction("GiveScoreToPlayer","i",%0)
#define API_RemoveScoreFromPlayer(%0) CallRemoteFunction("RemoveScoreFromPlayer","i",%0)
#define API_RespawnPlayer(%0) CallRemoteFunction("RespawnPlayer","i",%0)
#define API_XA_SetWantedLevel(%0,%1,%2) CallRemoteFunction("XA_SetWantedLevel","iii",%0,%1,%2)
#define API_ForceTakeMoneyFromPlayer(%0,%1) CallRemoteFunction("ForceTakeMoneyFromPlayer","ii",%0,%1)
////////////////////////////////////////////////////////////////////////////////
stock const TeamStrings[][] =
{
	{"~w~Dead"},{"~b~Cop"},{"~b~MBI"},{"~b~FBI"},{"~w~CIA"},{"~b~Army"},
	{"~p~Medic"},{"~g~Driver"},{"~g~Pilot"},{"~w~Civilian"},{"~r~Terrorist"}
};
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)